• Главная
  • Карта сайта
Не найдено

VRML в прикладах

  1. VRML в прикладах Марина Міланіна , Diamond Team Що таке VRML
  2. Одиниці виміру
  3. Тема VRML-файлу
  4. примітиви VRML
  5. Колір і текстура
  6. Положення об'єктів в просторі
  7. Визначення власних об'єктів

VRML в прикладах Марина Міланіна , Diamond Team

Що таке VRML

Мова VRML (Virtual Realty Modelling Languagy) призначений для опису тривимірних зображень і оперує об'єктами, що описують геометричні фігури і їх розташування в просторі.

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 # глибина} Cube {width 2 # ширина height 3 # висота depth 1 # глибина}

Сфера

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

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

конус

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

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

циліндр

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

Cylinder {parts ALL # видно всі частини циліндра radius 1 # радіус підстави height 2 # висота циліндра} 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} #VRML V1

Параметри 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 градусів.

У наведеному вище лістингу поворот здійснюється навколо осі 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}}

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-документів вручну.

  1. Всі описи вузлів і параметрів в VRML чутливі до регістру. Якщо Ви використовуєте літери неправильного регістра - то VRML-браузер просто проігнорує такий опис.
  2. У VRML має величезне значення порядок опису вузлів. Так наприклад, опис ... Rotation {...} Scale {...} ... і опис ... Scale {...} Rotation {...} ...

дають абсолютно різний результат.

Дуже дякую Ромке за картинки :)

Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью