WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » VRML в примерах

VRML в примерах


Дата публикации: 16-03-2013

Что такое VRML

Язык VRML (Virtual Realty Modelling Language) предназначен для описания трехмерных изображений и оперирует объектами, описывающими геометрические фигуры и их расположение в пространстве.

Vrml-файл представляет собой обычный текстовый файл, интерпретируемый браузером. Поскольку большинство браузеров не имеет встроенных средств поддержки vrml, для просмотра Vrml-документов необходимо подключить вспомогательную программу - Vrml-браузер, например, Live3D или Cosmo Player.

Как и в случае с HTML, один и тот же vrml-документ может выглядеть по-разному в разных VRML-браузерах. Кроме того, многие разработчики VRML-браузеров добавляют нестандартные расширения VRML в свой браузер.

Существует немало VRML-редакторов, делающих удобней и быстрее процесс создания Vrml-документов, однако несложные модели, рассматриваемые в данной статье, можно создать при помощи самого простого текстового редактора.
Единицы измерения

В VRML приняты следующие единицы измерения:

    Расстояние и размер: метры
    Углы: радианы
    Остальные значения: выражаются, как часть от 1.
    Координаты берутся в трехмерной декартовой системе координат (см. рис.)

Заголовок VRML-файла

Как уже говорилось, Vrml-документ представляет собой обычный тестовый файл.

Для того, чтобы VRML-браузер распознал файл с VRML-кодом, в начале файла ставится специальный заголовок - file header:

    #VRML V1.0 ascii 

Такой заголовок обязательно должен находиться в первой строке файла, кроме того, перед знаком диеза не должно быть пробелов.
Примитивы VRML

В VRML определены четыре базовые фигуры: куб (верней не куб, а прямоугольный параллепипед), сфера, цилиндр и конус.

Эти фигуры называются примитивами (primitives). Набор примитивов невелик, однако комбинируя их, можно строить достаточно сложные трехмерные изображения. Например, вот такие:

Здесь и далее, нашимая на картинку, Вы попадете в соответствующий мир. (Прим. ред.)

Рассмотрим поподробней каждый из примитивов.

Куб

Возможные параметры: width - ширина, height - высота, depth - глубина.

     Cube {   
        width   2    # ширина   
        height  3    # высота   
        depth   1    # глубина    
          } 

Сфера

Параметр у сферы только один, это radius.

    Sphere {   
        radius  1    # радиус   
           } 

Конус

Возможные параметры: bottomRadius - радиус основания, height - высота, parts - определяет, какие части конуса будут видны. Параметр parts может принимать значения ALL, SIDES или BOTTOM.

Cone {   
    parts         ALL  #видны и основание, и боковая поверхность конуса   
    bottomRadius  1    #радиус основания   
    height        2    #высота   
   } 

Цилиндр

Для цилиндра можно задать параметры radius и height. Кроме того, с помощью параметра parts для цилиндра можно определить будут ли отображаться основания цилиндра и его боковая поверхность. Параметр parts может принимать значения ALL, SIDES, BOTTOM или TOP.

      Cylinder {   
          parts   ALL      #видны все части цилиндра   
          radius  1        #радиус основания   
          height  2        #высота цилиндра   
              }    

Цвет и текстура

Цвет фигуры, определяется с помощью объекта Material.

    Material {   
         ambientColor    0.2 0.2 0.2   
         diffuseColor    0.8 0.8 0.8   
         specularColor   0 0 0   
         emissiveColor   0 0 0   
         transparency    0   
             } 

Параметры ambientColor, diffuseColor, specularColor и emissiveColor управляют цветами и указываются в палитре RGB (красный, зеленый и голубой), причем первая цифра определяет интенсивность красного цвета, вторая - зеленого, а третья - синего.

К примеру, синий кубик, может быть описан следующим образом:

    #VRML V1.0 ascii   
        Material {   
               diffuseColor 0 0 1   
                 }   
        Cube {}     

Параметр transparency может принимать значения от 0 до1 и определяет степень прозрачности, причем максимальная прозрачность достигается при transparency равном единице. В приведенном примере описано два цилиндра разных размеров, меньший из которых просвечивает сквозь другой.

    #VRML V1.0 ascii   
       Material {   
       diffuseColor 0 0 1   
          transparency    0.7   
                }   
       Cylinder {   
          height  1   
          radius  1   
                }   
       Material {   
          emissiveColor    1 0 0   
          transparency    0   
                }   
       Cylinder {   
          height  0.8   
          radius  0.1   
                } 

Для имитирования различных поверхностей в VRML существует объект Texture2.

В качестве текстуры легче всего использовать обычный графический файл, например, в GIF-формате. В таком случае для "натягивания" текстуры на трехмерное изображение нужно только указать путь к файлу в параметре filename объекта Texture2.

.     #VRML V1.0 ascii   
     Texture2 {   
                 filename    "krp.gif"   
                 image       0 0 0   
                 wrapS REPEAT    
                 wrapT REPEAT   
                    }   
     Cube {    
                 width 1   
                 height 1   
                 depth 1    
              } 

Параметры wrapS и wrapT могут принимать значения REPEAT или CLAMP, и управляют натягиванием текстуры по соответственно горизонтальной и вертикальной осям.
Положение объектов в пространстве
Изменение координат

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

Определение собственных объектов

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 не обязательны и показывают пользователю размеры и положение вставляемого объекта, пока объект подгружается.

Вместо заключения, хочется обратить Ваше внимание на две особенности VRML, незнание которых сильно затруднит создание VRML-документов вручную.

    Все описания узлов и параметров в VRML регистрозависимы. Если Вы используете буквы неправильного регистра - то VRML-браузер просто проигнорирует такое описание.
    В VRML имеет огромное значение порядок описания узлов. Так к примеру, описание

           ...   
           Rotation {...}   
           Scale {...}   
           ... 

    и описание

         ...   
         Scale {...}   
         Rotation {...}   
         ... 

    дают совершенно разный результат.

Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Август 2024 (1)
Май 2024 (1)
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Rick Cook:

"Программирование сегодня — это гонка разработчиков программ, стремящихся писать программы больше и с лучшей идиотоустойчивостью, и вселенной, которая пытается создавать больших и лучших идиотов. Пока вселенная побеждает."

Опрос

Какой аудио плеер Вы используете?

Winamp
Light Alloy
foobar2000
Apollo
AIMP
1by1
iTunes
jetAudio
Другой...