к библиотеке   к мультимедиа технологиям   к компьютерной графике   к визуальным средам - 4GL  

Технология виртуальной реальности VRML

Понятие VRML

VRML, Virtual Reality Modeling Language — язык моделирования виртуальной реальности, стандартный формат файлов для демонстрации трёхмерной интерактивной векторной графики, чаще всего используется в веб-технологиях.

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

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

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

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

Формат VRML

VRML — это текстовый формат файлов, где, например, вершины и грани многогранников могут указываться вместе с цветом поверхности, текстурами, блеском, прозрачностью и так далее. URL могут быть связаны с графическими компонентами, таким образом, что веб-браузер может получать веб-страницу или новый VRML-файл из сети Интернет тогда, когда пользователь щёлкает по какому-либо графическому компоненту. Движение, звуки, освещение и другие аспекты виртуального мира могут появляться как реакция на действия пользователя или же на другие внешние события, например таймеры. Особый компонент Script Node позволяет добавлять программный код (например, Java или JavaScript (ECMAScript)) к VRML-файлу.

VRML-файлы обычно называются мирами и имеют расширение .wrl (например: island.wrl). Хотя VRML-миры используют текстовый формат они часто могут быть сжаты с использованием алгоритма компрессии gzip для того, чтобы их можно было передавать по сети за меньшее время. Большинство программ трёхмерного моделирования могут сохранять объекты и сцены в формате VRML.

Стандарты VRML

Для дальнейшей коллективной разработки формата был создан консорциум Web3D.

Первая версия VRML была выпущена в ноябре 1994 года. Эта версия была основана на API и файловом формате программной компоненты Open Inventor, изначально разработанной в SGI. Текущая и функционально завершенная версия — VRML97 (ISO/IEC 14772-1:1997). Сейчас VRML вытесняется форматом X3D (ISO/IEC 19775-1).

Появление, популярность и упадок

Понятие VRML было введено Дэйвом Раджеттом (Dave Raggett) в документе представленом на Первой Международной Конференции по Всемирной Паутине (1994 год) и впервые обсуждалось на WWW94 VRML BOF, учреждённой Тимом Бернерсом-Ли где Марк Песке (Mark Pesce) представил демо-программу Labirinth (“Лабиринт”), разработанную им совместно с Тони Паризи (Tony Parisi) и Питером Кеннардом (Peter Kennard).

VRML достиг вершины популярности после выхода VRML 2.0 в 1997 году, когда он стал использоваться на некоторых персональных страницах и сайтах, в основном для 3D-чатов. Формат поддерживался SGI Cosmo Software (основной костяк программистов этого подразделения находился в Москве и сейчас это компания Parallel Graphics). Когда в 1998 году SGI была реструктурирована это подразделение было продано Platinum Technologies, которое было затем куплено Computer Associates. Последняя не стала развивать и распространять программы для VRML. Пустота была заполнена различными недолговечными коммерческими 3D-web форматами, появившимися за последние несколько лет, включая Microsoft Chrome, Adobe Atmosphere и Shockwave 3D, ни один из этих форматов не поддерживается сегодня. Возможности VRML оставались прежними, тогда как возможности трёхмерной компьютерной графики, работающей в реальном времени росли. VRML Consortium сменил своё название на Web3D Consortium и начал работать над потомком VRML — X3D.

Хотя VRML ещё продолжает использоваться в некоторых областях, особенно в образовательной и исследовательской сфере, где наиболее ценятся открытые спецификации, можно сказать, что он вытеснен форматом X3D. MPEG-4 Interactive Profile (ISO/IEC 14496) был основан на VRML (теперь на X3D) и X3D, по большей части, обратно-совместим с ним. VRML также продолжает использоваться в качестве файлового формата для обмена 3D-моделями, особенно в САПР.

Альтернативы

3DMLW — Язык 3D-разметки для веб (англ. 3D Markup Language for Web)

COLLADA — управляется Khronos Group

O3D — разработан Google

U3D — стандарт Ecma International ECMA-363

X3D — наследник VRML

Единицы измерения

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

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

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

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

    #VRML V1.0 ascii

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

Примитивы VRML

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

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

  текст визуальной VRML-модели

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

Куб

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

     Cube {
        width   2    # ширина
        height  3    # высота
        depth   1    # глубина 
          }
  текст визуальной VRML-модели

Сфера

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

    Sphere {
        radius  1    # радиус
           }
  текст визуальной VRML-модели

Конус

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

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

Цилиндр

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

      Cylinder {
          parts   ALL      #видны все части цилиндра
          radius  1        #радиус основания
          height  2        #высота цилиндра
              }   
  текст визуальной VRML-модели

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

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

Параметры 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
                       }
                }

  текст визуальной VRML-модели

Масштабирование

Узел Scale масштабирует фигуры по одному или нескольким измерениям. Три цифры, стоящие после параметра scaleFactor определяют коэффициенты масштабирования относительно осей x,y и z.

      Scale {
         scaleFactor 1 1 1
            }

В следующем примере, узел Scale сжимает сферу по оси x, и из сферы получается эллипсоид.

  текст визуальной VRML-модели

    #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-кода стал меньше, а сам код более читабельным.

Еще один способ уменьшить размер VRML-файла - вставлять фигуры из другого файла.

Это позволяет делать узел WWWInline:

    #VRML V1.0 ascii
    Separator {
          WWWInline {
              name        ""
              bboxSize    0 0 0
              bboxCenter  0 0 0
                    }
              }

Параметр name - это путь к файлу, параметры bboxSize и bboxCenter не обязательны и показывают пользователю размеры и положение вставляемого объекта, пока объект подгружается.

Вместо заключения

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

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

           ...
           Rotation {...}
           Scale {...}
           ...
    
    и описание

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

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

Ссылки

Система 3D-моделирования КОМПАС-3D - практические занятия

Определитель VRML плагинов и браузеров - показывает какие плагины у вас установлены

Учебники и примеры на русском

Cortona 3D - фирма, разрабатывающая ПО для VRML

к библиотеке   к мультимедиа технологиям   к компьютерной графике   к визуальным средам - 4GL  

Знаете ли Вы, что такое "усталость света"?
Усталость света, анг. tired light - это явление потери энергии квантом электромагнитного излучения при прохождении космических расстояний, то же самое, что эффект красного смещения спектра далеких галактик, обнаруженный Эдвином Хабблом в 1926 г.
На самом деле кванты света, проходя миллиарды световых лет, отдают свою энергию эфиру, "пустому пространству", так как он является реальной физической средой - носителем электромагнитных колебаний с ненулевой вязкостью или трением, и, следовательно, колебания в этой среде должны затухать с расходом энергии на трение. Трение это чрезвычайно мало, а потому эффект "старения света" или "красное смещение Хаббла" обнаруживается лишь на межгалактических расстояниях.
Таким образом, свет далеких звезд не суммируется со светом ближних. Далекие звезды становятся красными, а совсем далекие уходят в радиодиапазон и перестают быть видимыми вообще. Это реально наблюдаемое явление астрономии глубокого космоса. Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution