VRML предоставляет прекрасную возможность сократить и сделать более понятным исходный код VRML-файла путем описания собственных объектов. Это значит, что если в изображении несколько раз повторяется одна и та же фигура, то ее можно описать всего лишь один раз и в дальнейшем только ссылаться на нее.
Объект описывается одним из способов:
DEF name
Cube {}
или
DEF name
Material {}
или
DEF name
Separator {
Сгруппированные узлы, описывающие фигуру и свойства материала
}
Для того, чтобы вставить в VRML-файл ранее определенную фигуру, используется команда USE
Separator {
USE name
}
Создадим VRML-файл, описывающий стул, при этом ножку стула опишем как объект LEG:
#VRML V1.0 ascii
Material { emissiveColor 1 0.5 0.5 }
Separator {
Translation { translation 1 1 1 }
DEF LEG #Определяем объект - ножку стула
Separator { # leg
Cylinder {
height 0.8
radius 0.1
}
} # определили ножку
}
Separator {
Translation { translation 0 1 1 }
USE LEG # используем определенный объект
}
Separator { # еще одна ножка
Translation { translation 1 1 0 }
USE LEG
}
Separator { # последняя ножка
Translation { translation 0 1 0 }
USE LEG
}
Separator { # сиденье
Translation { translation 0.49 1.5 0.5 }
Cube {
height 0.2
width 1.2
depth 1.2
}
}
Separator { # спинка
Translation { translation 0.49 2 0 }
Cube {
height 0.8
width 1.2
depth 0.2
}
}
Separator { # закругление спинки
Translation { translation 0.49 2.1 0 }
Rotation {
rotation 1 0 0 1.57
}
Cylinder {
radius 0.6
height 0.2
}
}
Как видите, нам не понадобилось описывать каждую ножку в отдельности - в результате объем VRML-кода стал меньше, а сам код более читабельным.
Еще один способ уменьшить размер VRML-файла - вставлять фигуры из другого файла.
Это позволяет делать узел WWWInline:
#VRML V1.0 ascii
Separator {
WWWInline {
name ""
bboxSize 0 0 0
bboxCenter 0 0 0
}
}
Параметр name - это путь к файлу, параметры bboxSize и bboxCenter не обязательны и показывают пользователю размеры и положение вставляемого объекта, пока объект подгружается.