Создать новый узел в дереве сцены можно следующим образом:
[DEF <имя_узла>] <тип_узла> { <тело_узла> }
Зарезервированное слово DEF используется только в случае, если вы хотите дать имя своему узлу. Узел имеющий имя можно в дальнейшем использовать заново при помощи зарезервированного слова USE.
<тело_узла> может содержать любое количество полей, присваиваний IS, связок ROUTE, определений прототипов PROTO и EXTERNPROTO в любой последовательности.
Для примера определим простую сцену из трех кубов. Первый куб получает имя BOX1, а второй и третий строятся смещенными относительно первого:
#VRML V2.0 utf8 # определяем куб размером 1х1х1 # а также материалом (по умолчанию) DEF BOX1 Shape { appearance Appearance { material Material { } } geometry Box { } } # создаем копию куба смещенную # относительно первого Transform { translation 2 2 -2 children [ USE BOX1 ] } # и еще одну Transform { translation -2 -2 2 children [ USE BOX1 ] }
В результате получится такой виртуальный мир:
Пока мы не будем особо вдумываться в смысл всех записей, потому что мы о них узнаем позже, однако этот пример прекрасно иллюстрирует возможность повторного использования объектов. Если бы мы не определили куб BOX1 таким образом, то нам пришлось бы везде вместо строки USE BOX1 писать 8 строк эквивалентного кода. Это бы существенно увеличивало размер файла и было бы крайне не эффективно. Таким образом присваивание имен узлам с помошью DEF <имя> нужно для того, чтобы иметь возможность их копировать, т.е. повторно использовать их определение. Причем имя, как вы понимаете, можно давать не только "листу" дерева сцены, но и целой "ветке", в которой может быть описано несколько десятков или сотен объектов.
Еще одним способом повторного использования кода является узел Inline:
Inline { exposedField MFString url [] field SFVec3f bboxCenter 0 0 0 field SFVec3f bboxSize -1 -1 -1 }
Поле url является массивом, который содержит URL адреса VRML файлов. Браузер пытается загрузить и добавить к сцене первый VRML файл, если его попытка не увенчалась успехом, то он пытается загрузить следующий файл. Таким образом Вы можете подключать один и тот же файл из разных мест в интернете, если какой-то из сайтов выходит из строя.
Поле bboxSize и bboxCenter определяют ограничивающий параллелепипед, внутри которого будет содержаться загруженная сцена. Он предназначен для того, чтобы задержать загрузку этого файла, если его ограничивающий параллелепипед не виден пользователю.