VRML - что дальше?

Дальше, если вам неинтересно и скучно писать VRML руками - закройте VrmlPad, и запустите ISB. В нём вы сможете сделать такую же сцену не касаясь клавиатуры.
Да, и зачем вам такая сцена, попробуйте сделать сразу что-нибудь "крутое". Например, построить подводную лодку и отправить её в плавание по бескрайним просторам виртуальноко океана.
Что-нибудь вроде этого:
Подводная лодка 'ISB'
Как сделать такую сцену? Читайте здесь.

Если же ваша первая VRML сцена, построенная вручную, вдохновляет... нет, провоцирует вас сразу же её улучшить - то "оставайтесь с нами".
Прежде всего надо отметить, что конус получился какой-то невыразительный... "плоский". Это произошло от того, что мы определили только геометрию, и ничего не сказали об оптических свойствах материала.
Исправим этот недостаток:
#VRML V2.0 utf8
Shape {
	geometry Cone {}
	appearance Appearance {
		material Material {
			diffuseColor 0 0 1
		}
	}
}
				
Добавляем свойства материала
Ну, вот... другое дело. Что же мы написали? Рассмотрим дерево сцены, которое автоматически отображается в VrmlPad-е:
Дерево сцены
В основании этого дерева (в корне сцены) находиться объект Shape, у него есть два свойства (поля) geometry - геометрия и appearance - внешний вид.
Что бы задать геометрию, полю geometry присвоено значение объекта Cone.
Что бы задать внешний вид, полю appearance присвоено значение объекта Appearance.
Объект Appearance обладает собственными полями, мы используем одно из них - material.
Ему присвоено значение объекта Material, и уже в нём мы используем поле diffuseColor, значение которого и определяет цвет конуса.
Цвет задаётся как комбинация трёх составляющих: красной (0), зелёной(0) и синей(1).

Теперь анимируем конус. Для этого надо:
  1. создать новый объект, отвечающий за геометрические трансформации;
  2. присвоить этому объекту имя;
  3. создать объект - генератор событий и поименовать его;
  4. создать объект - описывающий траекторию и поименовать его;
  5. и установить связи между этими объектами;
Шаг 1:
#VRML V2.0 utf8
Transform {
	children [
		Shape {
			geometry Cone {}
			appearance Appearance {
				material Material {
					diffuseColor 0 0 1
				}
			}
		}
	]
}
				
У объекта Shape нет полей, позволяющих менять его положение в пространстве, поэтому приходиться надстраивать над ним специальный объект Transform. Его можно вращать, двигать и масштабировать, а вместе с ним и конус.

Шаг 2:
#VRML V2.0 utf8
DEF	main_TR Transform {
	children [
		Shape {
			geometry Cone {}
			appearance Appearance {
				material Material {
					diffuseColor 0 0 1
				}
			}
		}
	]
}
				
При помощи DEF мы присвоили объекту Transform уникальное имя "main_TR". В VRML это необходимо, если мы хотим динамически изменять значения полей объекта, например, вращать Transform.

Шаг 3:
#VRML V2.0 utf8
DEF	main_TR Transform {
	children [
		Shape {
			geometry Cone {}
			appearance Appearance {
				material Material {
					diffuseColor 0 0 1
				}
			}
		}
	]
}
DEF	main_TIS TimeSensor {
	cycleInterval 3
	loop TRUE
}
				
Мы добавили в корень сцены новый объект TimeSensor. Он послужит генератором событий, которые, в конце концов, приведут к вращению Transform-а.
Поле cycleInterval задаёт временной интервал цикла, а поле loop определяет будет ли этот цикл бесконечным.

Шаг 4:
#VRML V2.0 utf8
DEF	main_TR Transform {
	children [
		Shape {
			geometry Cone {}
			appearance Appearance {
				material Material {
					diffuseColor 0 0 1
				}
			}
		}
	]
}
DEF	main_TIS TimeSensor {
	cycleInterval 3
	loop TRUE
}
DEF	main_OI OrientationInterpolator	{
	key	[0, 0.5, 1]
	keyValue [1 0 0 0, 1 0 0 3.14, 1 0 0 6.28]
}
				
Ещё один новый объект OrientationInterpolator. Именно в нём заложена информация о траектории объекта.
В поле keyValue хранятся опорные координаты, между которыми OrientationInterpolator и будет, собственно, интерполировать.
А в поле key определяется относительная скорость перемещения объекта между опорными точками.
Ну, вот... всё готово, чтобы связать все эти объекты вместе.

Шаг 5:
#VRML V2.0 utf8
DEF	main_TR Transform {
	children [
		Shape {
			geometry Cone {}
			appearance Appearance {
				material Material {
					diffuseColor 0 0 1
				}
			}
		}
	]
}
DEF	main_TIS TimeSensor {
	cycleInterval 3
	loop TRUE
}
DEF	main_OI OrientationInterpolator	{
	key	[0, 0.5, 1]
	keyValue [1 0 0 0, 1 0 0 3.14, 1 0 0 6.28]
}
ROUTE main_TIS.fraction_changed TO main_OI.set_fraction
ROUTE main_OI.value_changed TO main_TR.rotation
				
При помощи конструкции ROUTE задаются маршруты следования событий в VRML-сцене. В нашем случае от поля fraction_changed объекта TimeSensor-а к полю set_fraction OrientationInterpolator-а, а от поля value_changed OrientationInterpolator-а к полю rotation объекта Transform-у.
Причём обязательно указывается уникальное имя объекта, ведь, например, Transform-ов в сцене может быть много.
Вот дерево нашей сцены:
Дерево сцены
А приблизительно так это выглядит в Cortona VRML client:

Анимируем сцену


Ну вот, начало положено... Теперь вы можете углублять свои познания VRML и накапливать опыт в построении виртуальных миров.
Главное пособие - спецификация VRML97:

http://www.web3d.org/x3d/specifications/vrml/ISO_IEC_14772-All/index.html

Непременно посмотрите материалы раздела VRML- подробнее.
Посетите раздел VRML ресурсы, там вы найдёте ссылки на другие "кладези знаний" в Internet.
дата обновления документа: