Лабораторная работа № 5
Представление сложных геометрических объектов в VRML
Сложные геометрические объекты
В качестве значения поля geometry(геометрия) узла Shape(форма) можно использовать один из
следующих узлов, позволяющих создавать сложные геометрические объекты:
PointSet (Набор точек) – позволяет задать набор точек определённого цвета в пространстве.
Синтаксис узла:
PointSet {
exposedField SFNode color NULL
#цвет
exposedField SFNode coord NULL
#координаты
}
Рассмотрим ещё 2 узла, связанные с узлом PointSet – Color и Coordinate.
Color (Цвет).
Синтаксис узла:
Color {
exposedField MFColor color []
}
С помощью этого узла можно описать значение цвета для каждой точки (последовательно
задаётся цвет каждой точки по порядку).
Coordinate (Коодинаты)
Синтаксис узла:
Coordinate {
exposedField MFVec3f point []
}
С помощью этого узла можно задать координату каждой точки (последовательно задаются
координаты каждой точки по порядку).
Точки не участвуют в проверке на столкновения.
Задание № 1 (файл 1-11.wrl) : создаются 8 разноцветных точек в пространстве.
#VRML V2.0 utf8
Shape{
appearance Appearance {
# можно задать прозрачность точек и цвета
# цвет каждой из точек можно определить непосредственно в самом
# узле PointSet, как показано ниже
# текстуры на точки наложить нельзя
}
geometry PointSet {
color Color { #цвет каждой из 8 точек соответственно
color [1 0 0, 0 1 0, 0 0 1, 0 1 1,
1 0 1, 1 1 0, 1 1 1, 0.5 0.5 0]
}
coord Coordinate { # координата каждой из 8 точек
point [ -2 0 2, 2 0 2, 2 0 -2, -2 0 –2,
-2 4 2, 2 4 2, 2 4 -2, -2 4 -2]
}
}
}
IndexedLineSet (Индексированный набор линий) – позволяет определить набор ломаных
линий (которые могут образовывать многоугольники) определённого цвета в пространстве.
Многоугольники не закрашены (состоят из линий).
Синтаксис узла:
IndexedLineSet {
eventIn MFInt32 set_colorIndex
eventIn MFInt32 set_coordIndex
exposedField SFNode color NULL
exposedField SFNode coord NULL
field MFInt32 colorIndex []
field SFBool colorPerVertex TRUE
field MFInt32 coordIndex []
}
Назначение полей:
• coord - определяет координаты вершин ломаных линий (так же, как в узле PointSet)
• coordIndex - определяет последовательность обхода координат из coord для построения
ломаных линий. Нумерация координат в coord начинается с 0. Если описание одной из
ломаных линий закончено, ставится маркер окончания ломаной линии (–1) - см. пример.
• colorPerVertex – если значение TRUE, то цвета, перечисленные в узле color, соответствуют
вершинам ломаных линий. Иначе цвета соответствуют ломаным линиям целиком.
• color - определяет цвета ломаных линий или их сегментов (цвета записываются, как в
PointSet).
• colorIndex – в этом поле перечисляется, какой цвет из узла Color какой вершине(или линии)
соответствует1.7986 0 T. Перечисляются порядковые номера цветов (0:N-1).
Например:
А) пусть у нас в узле Color определено 3 цвета (№ 0-2).
colorPerVertex FALSE
colorIndex [1 2 0] #вершине №0 соответствует цвет №1 из списка цветов
#вершине №1 соответствует цвет №2
#вершине №2 соответствует цвет №0
Б) пусть в узле Color 6 цветов (№ 0-5).
coord Coordinate { #здесь задаются 8 координат
point [ -2 0 2, 2 0 2, 2 0 -2, -2 0 -2
-2 4 2, 2 4 2, 2 4 -2, -2 4 -2]
}
# здесь задаётся последовательность обхода координат, заданных выше
# (по номерам: первая координата №0, вторая №1, последняя №7)
coordIndex [ 0 1 2 3 0 –1 #это координаты ломаной линии №0
#первая ломаная линия является цепочкой координат
#с номерами 0-1-2-3-0 – это замкнутый
#многоугольник с
# четырьмя вершинами
#-1 показывает, что координаты первой ломаной
#линии
#закончились
2 6 5 1 –1 #координаты ломаной №1
]
colorPerVertex TRUE #по умолчанию
# далее индексов должно быть перечислено столько же, сколько в поле coordIndex,
#включая маркеры
# окончания ломаных линий
colorIndex [1 3 5 2 1 –1 #данные номера цветов соответствуют
0 4 3 5 -1 #номерам вершин из поля coordIndex
]
Если индексы не указаны, то цвета соответствуют поверхностям (вершинам) в том порядке, в
котором они перечислены (цвет № n соответствует вершине № n, т. е. цвет № 0 вершине № 0,
цвет № 1 вершине № 1 и т. д.).
• set_colorIndex – входное событие, с помощью которого можно установить поле colorIndex.
• set_coordIndex - входное событие, с помощью которого можно установить поле coordIndex.
Линии не участвуют в проверке на столкновение.
Задание № 2 (файл 1-12.wrl) : рисуются 2 многоугольника, образующих 2 перпендикулярные
плоскости. Значения цветов в вершинах линий интерполируются по поверхностям линий.
#VRML V2.0 utf8
Shape{
appearance Appearance {
material Material {
#здесь можно определить цвета и прозрачность
#цвет можно также определить непосредственно в самом узле
#IndexedLineSet, как показано ниже
#текстуры на ломаные линии не накладываются
}
}
geometry IndexedLineSet {
color Color {
color[0 0 1,0 1 0,0 1 1,1 0 0,1 0 1,1 1 0,1 1 1]
}
coord Coordinate { #здесь задаются 8 координат
point [ -2 0 2, 2 0 2, 2 0 -2, -2 0 –2,
-2 4 2, 2 4 2, 2 4 -2, -2 4 -2]
}
# здесь задаётся последовательность обхода координат, заданных выше
# (по номерам: первая координата №0, вторая №1, последняя №7)
coordIndex [ 0 1 2 3 0 –1 #это координаты ломаной линии №0
#первая ломаная линия является цепочкой координат
#с номерами 0-1-2-3-0 – это замкнутый
#многоугольник с
# четырьмя вершинами
#-1 показывает, что координаты первой ломаной
#линии закончились
2 6 5 1 –1 #координаты ломаной №1
]
colorIndex[ 0 1 2 3 4 -1
5 6 0 1 -1
]
}
}
IndexedFaceSet (Индексированный набор поверхностей) – этот узел служит для создания
сложных геометрических фигур (с внутренней структурой или без неё), состоящих из набора
поверхностей.
Синтаксис узла:
IndexedFaceSet {
eventIn MFInt32 set_colorIndex
eventIn MFInt32 set_coordIndex
eventIn MFInt32 set_normalIndex
eventIn MFInt32 set_texCoordIndex
exposedField SFNode color NULL
exposedField SFNode coord NULL
exposedField SFNode normal NULL
exposedField SFNode texCoord NULL
field SFBool ccw TRUE
field MFInt32 colorIndex []
field SFBool colorPerVertex TRUE
field SFBool convex TRUE
field MFInt32 coordIndex []
field SFFloat creaseAngle 0
field MFInt32 normalIndex []
field SFBool normalPerVertex TRUE
field SFBool solid TRUE
field MFInt32 texCoordIndex []
}
Перед описанием полей данного узла рассмотрим ещё один узел – Normal.
Normal (Нормаль) – определяет список векторов нормалей.
Синтаксис узла:
Normal {
exposedField MFVec3f vector []
}
Например поле:
normal Normal {
vector [1 0 1,
-1 0.5 -1,
-2 0 –3
]
}
определяет 3 вектора нормалей с соответствующими координатами.
Нормали нужны для вычисления того, как поверхность будет освещена. Если мы изменим
значение нормали для поверхности, то в браузере мы увидим, как поменяется освещение этой
поверхности.
Описание полей:
• color - так же, как в IndexedLineSet.
• coord - координаты вершин (узел Coordinate - как в IndexedLineSet).
• normal - список нормалей (в качестве значения применяется узел Normal).
• texCoord - применяется для нанесения текстуры (см. ниже узел TextureCoordinate).
• ccw - если TRUE, то видимые поверхности, перечислямые в coordIndex – это те,
номера вершин у которых перечислены против часовой стрелки. Если ccw FALSE,
то видимые поверхности это те, номера вершин которых перечислены по часовой
стрелке.
• colorIndex - так же, как в IndexedLineSet (в зависимости от значения colorPerVertex).
colorPerVertex - цвета соответствуют поверхностям (если значение FALSE) или вершинам
(TRUE).
• convex - если в фигуре присутствуют невыпуклые (неплоские, самопересекающиеся)
многоугольники, то значением данного поля следует указать FALSE (иначе
результат работы браузера не определён).
• coordIndex - соответствие координат поверхностям – список номеров координат с маркером
окончания (-1) для каждой поверхности. Номера вершин для видимой поверхности
перечисляются против часовой стрелки (если ccw TRUE) если значение solid=true.
Если значение solid=false (ccw TRUE), то поверхность видна с двух сторон.
• creaseAngle - если поле normal пусто (NULL), то браузер использует этот угол для
вычисления того, как поверхность будет освещаться. В зависимости от значения
этого поля у поверхности будет гладкое или негладкое затенение. Значение этого поля –
угол, который определяет, как генерируются нормали по умолчанию. Если угол между
геометрическими нормалями двух смежных поверхностей меньше, чем creaseAngle, то
нормали вычисляются таким образом, что поверхности по краю имеют гладкое затенение.
• normalIndex – перечисляются номера нормалей на соответствие вершинам или
поверхностям (в зависимости от значения normalPerVertex) – по такому же принципу, как в
colorIndex.
• normalPerVertex - нормали соответствуют поверхностям (FALSE) или вершинам (TRUE).
• solid - см. coordIndex.
• texCoordIndex - значением этого поля является узел TextureCoordinate (см. ниже).
Задание № 3 (файл 1-13.wrl) : определяется 4 полупрозрачные плоскости (видимые с двух сторон),
определяющие ½ куба. Цвета соответствуют вершинам (интерполируются между ними).
#VRML V2.0 utf8
Shape{
appearance Appearance {
material Material {
transparency 0.5 # полупрозрачный материал
}
}
geometry IndexedFaceSet {
coord Coordinate {
point [ -2 0 2, 2 0 2, 2 0 -2, -2 0 –2,
-2 4 2, 2 4 2, 2 4 -2, -2 4 -2]
}
coordIndex [ 0 4 7 3 -1
1 2 6 5 -1
4 5 6 7 -1
2 3 7 6 -1 ]
solid FALSE
color Color {
color[0 0 1,0 1 0,0 1 1,1 0 0,1 0 1,1 1 0,1 1 1]
}
colorIndex [ 0 1 2 3 -1
4 5 6 0 -1
1 2 3 4 -1
5 6 0 1 -1 ]
}
}
Пример (файл 2-1-1.wrl) : определяется 4 плоскости, каждая видна только с одной стороны.
Цвета соответствуют вершинам (интерполируются между ними).
#VRML V2.0 utf8
Shape{
appearance Appearance {
material Material {
}
}
geometry IndexedFaceSet {
coord Coordinate {
point [ -2 0 2, 2 0 2, 2 0 -2, -2 0 –2,
-2 4 2, 2 4 2, 2 4 -2, -2 4 -2]
}
coordIndex [ 0 4 7 3 -1
5 6 2 1 -1
4 5 6 7 -1
6 7 3 2 -1 ]
color Color {
color[0 0 1,0 1 0,0 1 1,1 0 0,1 0 1,1 1 0,1 1 1]
}
colorIndex [ 0 1 2 3 -1
4 5 6 0 -1
1 2 3 4 -1
5 6 0 1 -1 ]
}
}
Пример (файл 2-1-2.wrl) : это пример по нормалям. Для первой (слева направо) пирамиды
нормали не определяется, у второй пирамиды нормали соответствуют поверхностям, у третьей
– вершинам. Можно посмотреть, как меняется освещение на каждой из пирамид.


