Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

VRML'97 - Объекты, строящиеся по набору вершин.

В отличие от предыдущего раздела для описания объектов, описываемых здесь, необходимо задать координаты вершин, на основе которых объект строится.

PointSet (набор точек)

Описание:

PointSet {
coord NULL
color NULL }

Поскольку по умолчанию coord=color=NULL, то вставка в код узла PointSet без аргументов не приведет ни к чему, не будет создано ни одной точки.

Количество записей в разделе color должно точно соответствовать количеству точек, описанных в разделе coord!

Мне лично такой узел кажется бесполезным, но с его помощью можно сотворить что-нибудь такое:

Просмотр. Текст кода. Надеюсь, Вы рассмотрели чередующиеся красные, зеленые и синие точки на экране.

IndexedLineSet (линии по набору точек)

Описание:

IndexedLineSet {
color NULL
coord NULL
colorIndex []
colorPerVertex TRUE
coordIndex []
}

Схема использования этого узла заключается в следующем: в разделе coord описывается набор точек, а в разделе coordIndex приводятся последовательности точек (их номера в списке раздела coord), которые соединяются отрезками. Конец последовательности обозначается приведением после номера последней точки значения -1.

Для этого узла важно разобраться со способами раскраски отрезков. Если у Вас ничего не прописано в разделе color, то ничего не увидите, т.к. отрезки не окрашены (хотя можно при этом воспользоваться emissiveColor в разделе appearance (об этом см далее))

Если colorPerVertex TRUE, то цвет из списка в разделе color приписывается ВЕРШИНАМ, а отрезки, соединяющие их окрашиваются с градиентом от цвета одной вершины к цвету другой.

Вот, например, "знак Зорро" :)

Просмотр. Текст кода.

Если colorPerVertex FALSE, то цвета из списка в разделе color приписывается КАЖДОЙ ПОЛИЛИНИИ, а не каждому ОТРЕЗКУ!

Вот тот же код, только с colorPerVertex FALSE. Как видно, всей полилинии из вершин 1 0 3 2 приписан красный цвет, первым описанный в color. Тогда оставшиеся зеленый, синий и белый цвета просто не нужны. Проверьте vorlon'ом.

Просмотр. Текст кода.

Давайте вернемся к нашему столу, на котором уже стоит глобус. Предлагаю поставить на нее, например, клетку, пока пустую.

Просмотр. Текст кода.

IndexedFaceSet (грани по набору точек)

Описание:

IndexedFaceSet {
coord NULL
color NULL
normal NULL
texCoord NULL
ccw TRUE
colorIndex []
colorPerVertex TRUE
convex TRUE
coordIndex
creaseAngle 0
normalIndex []
normalPerVertex TRUE
solid TRUE
texCoordIndex []
}

Вот он! Вот он! Узел, которым можно заменить все остальные узлы, связанные с описанием граней. Все люди, использующие экспорт в VRML код из какого-нибудь 3D моделлера, получают файл, набитый только IndexedFaceSet. Принцип работы узла очень похож на IndexedLineSet: описан набор координат точек (coord) и указано, какие из них должны образовать грань (coordIndex).

Для того, чтобы получить что-то вразумительное, должны выполняться три условия:

  1. каждая грань должна состоять как минимум из трех несовпадающих вершин
  2. вершины должны задавать ПЛОСКИЙ многоугольник
  3. многоугольник должен быть несамопересекающимся

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

Раскраска объектов в этом узле происходит так же, как и в IndexedLineSet:
при colorPerVertex TRUE цвет приписывается ВЕРШИНАМ, а грань заливается градиентом между всеми вершинами, которыми грань создана.
при colorPerVertex FALSE цвет приписывается каждой ГРАНИ в порядке, соответствующем порядку цветов в разделе color

Создадим для примера кубик без одной грани средствами узла IndexedFaceSet и раскрасим, пользуясь colorPerVertex TRUE

Просмотр. Текст кода.

А теперь переключитесь в режим просмотра wireframe: видите, хотя мы описали КВАДРАТНЫЕ грани, броузер все равно представляет их, как состоящие из треугольников, так же, как и все остальные объекты, так что узел IndexedFaceSet - это по определению основная форма представления объектов в VRML.

В разделе "Инструменты" я упоминал о программах визуализации трансляционно-симметричных структур.

Вот, посмотрите несколько примеров использования узла IndexedFaceSet

Просмотр.
Просмотр.
Просмотр.

"Фи" - кто-то скажет, - "примитив". Верно, но даже в VRML редакторе (а уж ручками...) Вам придется попотеть, прописывая кучу раз USE. А если я скажу, что при создании этих примеров входные данные для программы составили 2-3 строчки?! И при этом можно построить объектов, сколько хочется: не 4x4x4, как в приведенных примерах, а 1000x1000x1000. Вот то-то же :). Правда, все-таки, использование подобных геометрически правильных объектов довольно ограничено. Но если Вас такое интересует, плиз в мыло: хочется познакомится с такими героями :)

Extrusion (экструзия, выдавливание)

писание:

Extrusion {
beginCap TRUE
ccw TRUE
convex TRUE
creaseAngle 0
crossSection [1 1, 1 -1, -1 -1, -1 1, 1 1]
endCap TRUE
orientation 0 0 1 0
scale 1 1
solid TRUE
spine [0 0 0, 0 1 0]
}

Узел Extrusion - это основное орудие борьбы с IndexedFaceSet, позволяющее сильно сократить объем файла. Работает узел очень просто: сначала описывается МНОГОУГОЛЬНИК в плоскости с Y=0 (поэтому в разделе crossSection="сечение" только две координаты) и траектория его движения в пространстве (раздел spine). Разделы beginCap и endCap определяют, будут ли грани-"крышки" на торцах Вашего объекта. Я плохо понимаю, для чего по умолчанию solid выставлен TRUE: в спецификации написано, что значением этого раздела регулируется, будут ли видны одна или обе стороны многоугольника одновременно, в общем поиграйтесь с FALSE/TRUE, поймете сами.

В каждой точке траектории многоугольник можно:

  • масштабировать (раздел scale). Обратите внимание, количество значений шкального множителя должно либо 1 (тогда масштабируется исходное сечение crossSection и далее не изменяется - это дурацкий случай, легче сразу было задать правильное сечение), либо совпадать с количеством точек в траектории (spine). Если количество значений в разделе scale больше единицы, но МЕНЬШЕ количества значений в разделе spine, то результат спецификацией VRML не определен (обычно получается бредовый объект). Если количество значений в разделе scale больше единицы, и БОЛЬШЕ количества значений в разделе spine, то лишние игнорируются.

    Просмотр. Текст кода.

    Благодаря масштабированию можно делать также всякие остроконечности - нужно только задать "scale ... ,0 0, ..."

    Просмотр. Текст кода.

    Это, конечно, не шедевр, но чего Вы хотели от неархивированного кода в 0.28кб ? :). Посмотрите в профиль на схождение на нет "заточки" "меча"...

  • вращать (раздел orientation). Задается направление оси вращения (первые три числа) и угол в радианах. Вращать можно как по часовой стрелке, так и против (знак угла). Количество значений в разделе orientation определяется так же, как и для масштабирования.

    Просмотр. Текст кода.

    Непонятно, что это, но имхо красиво и, что важнее, короче, чем через IndexedFaceSet.

    Да, так по поводу борьбы с IndexedFaceSet. Наглядный ПРИМЕР:

    понадобился мне тор. Не желая делать лишней работы, залезаю в архив wrl-файлов, скачанных из сети. Нахожу (хотя и в формате VRML1), ничего себе размер - 14.6кб. Просмотр. Естественно, сделано через IndexedFaceSet, небось экспортировано откуда-нибудь. Почесав в затылке, делаю свой - через extrusion. Просмотр. Вот он - 0.48кб. Хороша разница - в 30 раз!. Переключитесь-ка в режим wireframe: а мой-то и покачественней! Надеюсь, убедительно.

ElevationGrid (рельеф по набору точек)

Описание:

ElevationGrid {
color NULL
normal NULL
texCoord NULL
height []
ccw TRUE
colorPerVertex TRUE
creaseAngle 0
normalPerVertex TRUE
solid TRUE
xDimension 0
xSpacing 1.0
zDimension 0
zSpacing 1.0
}

Наилучшее применение узла ElevationGrid - создание рельефа. Построение ведется следующим образом: представьте себе сетку (хоть рыболовецкую, хоть авоську :) с прямоугольными ячейками и лежащую в плоскости XZ.

Вы задаете количество ячеек по X и Z (разделы xDimension и zDimension) и для каждой точки пересечения "волокон" задаете ее "высоту"-координату по Y. Размеры всего объекта и его пропорции вытекают из величины зазоров между "волокнами" (разделы xSpacing и zSpacing). Вот, вкратце, и все.

Просмотр. Текст кода.

Довольно гладко выглядит, хотя всего 28x28 ячеек! Те, кто работал с программами от Golden Software, наверное, даже узнали функцию, выставленную по умолчанию в Grid...->Function... :)

Назад | Содержание | Вперед

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог