Изменение координат

По умолчанию любой описанный нами объект будет располагаться точно по центру окна браузера. По этой причине, если мы опишем к примеру два одинаковых цилиндра, они сольются друг с другом. Для того, чтобы изменить положение второго цилиндра, применим узел 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}

             }