[an error occurred while processing this directive]
В отличие от предыдущего раздела для описания объектов, описываемых здесь, необходимо задать координаты вершин, на основе которых объект строится.
Описание:
PointSet { coord NULL color NULL }
Поскольку по умолчанию coord=color=NULL, то вставка в код узла PointSet без аргументов не приведет ни к чему, не будет создано ни одной точки.
Количество записей в разделе color должно точно соответствовать количеству точек, описанных в разделе coord!
Мне лично такой узел кажется бесполезным, но с его помощью можно сотворить что-нибудь такое:
Просмотр. Текст кода. Надеюсь, Вы рассмотрели чередующиеся красные, зеленые и синие точки на экране.
Описание:
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 { 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).
Для того, чтобы получить что-то вразумительное, должны выполняться три условия:
Легко догадаться, что все условия автоматически выполняются для треугольника, хотя в частном случае можете задавать плоские многоугольники с любым числом вершин.
Раскраска объектов в этом узле происходит так же, как и в IndexedLineSet:
при colorPerVertex TRUE цвет приписывается ВЕРШИНАМ, а грань заливается градиентом между всеми вершинами, которыми грань создана.
при colorPerVertex FALSE цвет приписывается каждой ГРАНИ в порядке, соответствующем порядку цветов в разделе color
Создадим для примера кубик без одной грани средствами узла IndexedFaceSet и раскрасим, пользуясь colorPerVertex TRUE
А теперь переключитесь в режим просмотра wireframe: видите, хотя мы описали КВАДРАТНЫЕ грани, броузер все равно представляет их, как состоящие из треугольников, так же, как и все остальные объекты, так что узел IndexedFaceSet - это по определению основная форма представления объектов в VRML.
В разделе "Инструменты" я упоминал о программах визуализации трансляционно-симметричных структур.
Вот, посмотрите несколько примеров использования узла IndexedFaceSet
"Фи" - кто-то скажет, - "примитив". Верно, но даже в VRML редакторе (а уж ручками...) Вам придется попотеть, прописывая кучу раз USE. А если я скажу, что при создании этих примеров входные данные для программы составили 2-3 строчки?! И при этом можно построить объектов, сколько хочется: не 4x4x4, как в приведенных примерах, а 1000x1000x1000. Вот то-то же :). Правда, все-таки, использование подобных геометрически правильных объектов довольно ограничено. Но если Вас такое интересует, плиз в мыло: хочется познакомится с такими героями :)
писание:
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 ... ,0 0, ..."
Это, конечно, не шедевр, но чего Вы хотели от неархивированного кода в 0.28кб ? :). Посмотрите в профиль на схождение на нет "заточки" "меча"...
Непонятно, что это, но имхо красиво и, что важнее, короче, чем через IndexedFaceSet.
Да, так по поводу борьбы с IndexedFaceSet. Наглядный ПРИМЕР:
понадобился мне тор. Не желая делать лишней работы, залезаю в архив wrl-файлов, скачанных из сети. Нахожу (хотя и в формате VRML1), ничего себе размер - 14.6кб. Просмотр. Естественно, сделано через IndexedFaceSet, небось экспортировано откуда-нибудь. Почесав в затылке, делаю свой - через extrusion. Просмотр. Вот он - 0.48кб. Хороша разница - в 30 раз!. Переключитесь-ка в режим wireframe: а мой-то и покачественней! Надеюсь, убедительно.
Описание:
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... :)
Назад | Содержание | Вперед
[an error occurred while processing this directive]