Шаг 14 - Сетка высот, узел ElevationGrid

Этот узел определяется следующим образом:

ElevationGrid { 
  eventIn      MFFloat  set_height
  exposedField SFNode   color             NULL
  exposedField SFNode   normal            NULL
  exposedField SFNode   texCoord          NULL
  field        MFFloat  height            []
  field        SFBool   ccw               TRUE
  field        SFBool   colorPerVertex    TRUE
  field        SFFloat  creaseAngle       0
  field        SFBool   normalPerVertex   TRUE
  field        SFBool   solid             TRUE
  field        SFInt32  xDimension        0
  field        SFFloat  xSpacing          1.0
  field        SFInt32  zDimension        0
  field        SFFloat  zSpacing          1.0
}

Он задает в пространстве сетку лежащую в плоскости XZ (т.е. на поверхности "земли"), в которой каждая точка пересечения поднята или опущена по отношению к плоскости Y=0 на высоту определенную в массиве height[].

Данный массив имеет размерность заданную в количестве элементов сетки по оси X и Z соответствующими параметрами xDimension и zDimension. Если мы хотим создать сетку 5х5 элементов, то мы должны задать массив height из 25 элементов.

Параметры xSpacing и zSpacing задают расстояние между линиями сетки в метрах. Давайте рассмотрим пример:

#VRML V2.0 utf8
WorldInfo { 
  info  ["ElevationGrid Example !!!"]
  title "ElevationGrid"
}
Group {
children[
	Shape {
		appearance Appearance {
#			назначаем красный цвет для
#			поверхности (diffuseColor 1 0 0)
			material Material {
				diffuseColor 1 0 0
			}
		}
		geometry ElevationGrid {
			xDimension 5
			zDimension 5
			xSpacing 0.5
			zSpacing 0.5			
			height[
				.1  .2  .3  .4  .5
				.1  .4  .3  .3  .4
				.1  .2  .2  .3  .3
				.1  .1  .3  .2  .2
				.3  .1  .1  .1  .2
			]			
		}
	}
]
}

После этого браузер отобразит нечто похожее на следующий рисунок:

14_1.gif (3839 b)

Он конечно же изобилует дополнительными построениями, которые я выполнил для того, чтобы был более понятен процесс происходящего. Из рисунка мы видим, что наша выпуклая поверхность помещяется первой точкой height[0] в центр координат. Это отличает данный узел от других, так как рассматриваемые нами узлы до этого устанавливались своим центром в точку (0,0,0).

Также из рисунка мы можем наглядно понять, как влияет количество точек xDimension и zDimension, а также расстояние между ними xSpacing и zSpacing на отображаемую поверхность. Чем больше точек вы зададите, тем более качественную (т.е. сглаженную) поверхность получите, естественно при этом и расстояние между точками надо уменьшать.

Поле solid, как и раньше, влияет на количество видимых сторон поверхности. Если поле solid установлено в FALSE, то поверхность видна с двух сторон, если TRUE (значение по умолчанию), то поверхность видна только сверху.

Поле creaseAngle влияет на гладкость поверхности. Значение этого поля задается в радианах. Между нормалями двух соседних граней существует геометрический угол, значение этого угла сравнивается со значением поля creaseAngle. Если значение поля больше угла между нормалями, то между этими гранями переход отображается сглаженным, иначе угол будет "острым". Следующие три рисунка демонстрируют этот эффект:

14_2.gif (1257 b)14_3.gif (2263 b)14_4.gif (2477 b)

Остальные поля мы пока отложим из-за того, что нам еще не известно освещение и текстурирование. Потом мы рассмотрим эти поля более детально, так как именно они позволяют придать поверхности больший эффект натуральности.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей.