По умолчанию любой описанный нами объект будет располагаться точно по центру окна браузера. По этой причине, если мы опишем к примеру два одинаковых цилиндра, они сольются друг с другом. Для того, чтобы изменить положение второго цилиндра, применим узел Translation.
Узел Translation определяет координаты объекта:
Translation { translation 1 2 3 #т.е. соответственно x=1 y=2 z=3 }
Вообще говоря, координаты указываемые в Translation не являются абсолютными. Фактически это координаты относительно предыдущего узла Translation. Чтобы прояснить это вопрос, рассмотрим пример:
#VRML V1.0 ascii Cube { width 1 height 1 depth 1 } # Этот куб по умолчанию располагается в центре Translation { translation 2 0 0 } #Второй куб сдвинут вправо на 2 Cube { width 1 height 1 depth 1 } Translation { translation 2 0 0 } #Третий куб сдвинут вправо на два относительно 2-го !!!! Cube { width 1 height 1 depth 1 }
Как видите, третий кубик вовсе не совпадает с первым, хотя в в узле Translation указаны те же координаты.
В VRML 1.0 принято следующее правило: узлы, модифицирующие свойства фигур (Translation, Material и т.п.), действуют на все далее описанные фигуры.
Чтобы ограничить область действия модифицирующих узлов, фигуры необходимо сгруппировать с помощью узла Separator.
Separator { другие узлы }
Узел Separator работает как контейнер, он может содержать любые другие узлы, и основным его предназначением является именно ограничение области действия узлов типа Translation и Material.
Сравните следующий пример с предыдущим:
#VRML V1.0 ascii Separator { Cube { width 1 height 1 depth 1 } }# конец области действия узла Separator Separator { Translation { translation 2 0 0 } #Второй куб сдвинут вправо на 2 Cube { width 1 height 1 depth 1 } }# конец области действия узла Separator Separator { Translation { translation 2 0 0 } #Третий куб сдвинут вправо на два относительно 1-го. Cube { width 1 height 1 depth 1 } }# конец области действия узла Separator
Хотя в примере описано три кубика, мы видим только два, так как второй и третий совпадают.
Вообще говоря рекомендуется всегда и везде использовать узел Separator. Он не только избавит от ошибок, связанных с относительностью координат, но и сделает VRML-код более простым и понятным.
Для вращения фигур вокруг осей координат применяется узел Rotation.
Rotation { rotation 0 1 0 1.57 }
Первые три цифры определяет будет ли осуществлен поворот вокруг соответственно осей x, y и z, а четвертая задает угол вращения в радианах. В приведенном выше листинге поворот осуществляется вокруг оси y на 90 градусов.
Углы в градусах | Радианы |
30 | 0.52 |
45 | 0.78 |
60 | 1.04 |
90 | 1.57 |
180 | 3.14 |
270 | 4.71 |
Составим букву T из двух цилиндров. По умолчанию цилиндр ориентирован вертикально (см. рисунок). Поэтому для успешного выполнения задачи повернем его вокруг оси z на 90 градусов.
#VRML V1.0 ascii Separator { #Красный цилиндр Material { emissiveColor 1 0.6 0.6 } Cylinder { height 1 radius 0.3 } } Separator { # Синий цилиндр, повернутый на 90 градусов вокруг оси z Translation { translation 0 0.5 0 } Rotation { rotation 0 0 1 1.57 } Material { emissiveColor 0.5 0.5 1 } Cylinder { height 1 radius 0.3 } }
Узел Scale масштабирует фигуры по одному или нескольким измерениям. Три цифры, стоящие после параметра scaleFactor определяют коэффициенты масштабирования относительно осей x,y и z.
Scale { scaleFactor 1 1 1 }
В следующем примере, узел Scale сжимает сферу по оси x, и из сферы получается эллипсоид.
#VRML V1.0 ascii Material { emissiveColor 1 1 0 } Scale { scaleFactor 0.7 1 1 #сжимаем сферу по оси x } Sphere { radius 1} }