Лабораторная работа № 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) : это пример по нормалям. Для первой (слева направо) пирамиды

нормали не определяется, у второй пирамиды нормали соответствуют поверхностям, у третьей

– вершинам. Можно посмотреть, как меняется освещение на каждой из пирамид.