Vrml’97 анимация сенсоры, маршруты, интерполяторы


Содержание

Язык трехмерного моделирования VRML и его образовательные возможности

Часть 1. Любуемся результатами технологии VRML

VRML — это танцующий медведь. Всех поражает не то, как он танцует, а то, что он танцует вообще [1].

Другой трехмерной технологии, позволяющей делать такие вещи, не существует. . Одна из бед VRML была в том, что на нем пытались мультфильмы делать, всяческие entertainment, а надо было гайки и болты рисовать — с этого и денег больше, и делать проще [2].

Что такое VRML?

VRML (Virtual Reality Modeling Language) часто неявно считается некоторым дополнением к HTML, позволяющим создавать на web-страницах трехмерные виртуальные миры. Исторически такая точка зрения справедлива, поскольку именно в Интернете планировалось разместить первые VRML-миры. В то же время, VRML есть вполне самостоятельный язык описания объемных объектов, который может использоваться вне Сети. В частности, большинство программ трехмерного моделирования могут сохранять объекты и сцены в формате VRML; особенно часто это применяется в САПР. Так что интуитивное представление, что VRML — это “то же самое, что HTML, только для описания трехмерных объектов”, явно уводит нас в сторону от действительности.

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

Используя файлы текстового формата 3 , язык VRML позволяет описать не только геометрические свойства объектов в трехмерном пространстве, например, расположение и форму сложных поверхностей и многогранников, но и физические данные об их цвете, текстуре, блеске, прозрачности, источниках освещения и так далее. Как и в HTML, графические 3D-компоненты можно связать с другими web-страницами или новыми VRML-файлами Сети. Кроме того, в качестве реакции на действия пользователя или другие внешние события, например таймеры, могут появляться движение, звуки, освещение и другие аспекты виртуального мира. Особый компонент Script Node позволяет добавлять программный код (например, Java или JavaScript).

VRML-файл обычно принято называть миром (world), поэтому он имеет расширение wrl, например, city.wrl. Виртуальные миры способны выглядеть весьма впечатляюще (примеры будут описаны далее).

По своей сути VRML, скорее, можно назвать языком программирования, причем ярко выраженным объектно-ориентированным языком. Говоря о нем, во многом более уместно проводить параллели не столько с HTML, сколько с Java. Кроме того, как и Java, VRML платформенно-независим, и область его применения точно так же не ограничивается технологиями Internet/Intranet, для которых он изначально разрабатывался.

Языку VRML уже более десяти лет (в качестве даты его рождения принято называть 1994 год, когда на конференции по World Wide Web были впервые сформулированы основные концепции этого языка). И хотя за это время ему не удалось стать чем-то широко распространенным, он тем не менее продолжает существовать и использоваться, имея, несмотря на постоянные споры и критику, своих ярых поклонников. Приведенные в качестве эпиграфов полярные по оценке цитаты ярко подтверждают это. Хорошее представление о статусе VRML дает нижеследующая цитата из введения к замечательной статье [3]:

“Технология создания виртуальных миров в Internet успешно развивается и совершенствуется, но как-то полуподпольно по сравнению с тем же Java. Если воспользоваться терминологией из мира музыки, то язык VRML имеет культовый статус, т.е. имеет устойчивую армию приверженцев, не имеющую ярко выраженной тенденции к изменению численности как в меньшую, так и в большую сторону. Вероятных причин можно назвать несколько, например, повышенные требования к производительности компьютеров, на которых работает интерпретатор VRML. Но единственным, по-настоящему фатальным препятствием на пути распространения этой технологии может стать только невозможность ее освоения “с ходу”. Сделать более-менее сносную страницу Web способен любой, кто знаком с текстовым редактором и готов потратить часок на изучение основ HTML, создать же что-либо привлекательное в виртуальном пространстве, очевидно, не так просто”.

Последняя мысль по поводу необходимости разъяснения основ VRML “широким слоям публики” подтверждает мнение редакции (автор данной публикации полностью солидарен с ним!), что некоторое привлекательное по форме, но глубокое по содержанию описание VRML будет весьма полезным.

Данная статья написана специально для газеты “Информатика” и имеет строго определенную направленность. Она ни в коей мере не претендует на роль полного описания языка и не ставит целью научить создавать эффектную виртуальную реальность. Статья направлена лишь на то, чтобы показать и объяснить, как весьма простыми средствами VRML удается создать несложные, но полезные для преподавания иллюстрации, в частности, чертежи к задачам по стереометрии, модели простейших молекул для уроков химии и физики или иллюстрации взаимного расположения небесных тел в астрономии. Подобное вполне по силам среднестатистическому ученику! Конечно, более заманчиво выглядит идея самостоятельного создания трехмерных сцен виртуальной реальности для уроков истории или географии, но в школьных условиях это выглядит, простите за невольный каламбур, нереально.

Публикация естественным образом разделяется на две части: “Любуемся результатами технологии VRML” и “Понимаем и создаем VRML”. Мы надеемся, что читатели проявят интерес не только к первой из них, ибо по замыслу она является лишь эффектным введением ко второй, создавая необходимую стойкую мотивацию к знакомству с основами языка.

При более внимательном знакомстве со статьей (здесь главным образом речь идет о второй части) читатели газеты смогут обнаружить в ней некоторые существенные педагогические аспекты, связанные с подходами к изложению сложного материала. В Интернете можно найти множество описаний VRML, которые построены по схемам “36 узлов VRML 1.0” или “VRML в примерах”. Автор считает, что ни один из этих подходов не является с образовательной точки зрения эффективным, и пытается провести изложение в другой манере, которую полагает гораздо более подходящей и продуктивной, хотя ее применяют гораздо реже. Несмотря на субъективность описываемой методики изложения, видимо, учителям стоит обратить внимание и на этот аспект публикации.

Примечание. Поиск материалов по VRML в Интернете в очередной раз показал некоторые характерные для русского сегмента Сети особенности: материалы многократно дублированы, имеется 3–4 самоучителя, кочующие с сайта на сайт, причем источник и авторство материалов, как правило, не указываются. Тем приятнее бывает обнаружить что-нибудь подлинно индивидуальное и глубокое, не являющееся переводом стандартной документации с английского языка. Например, уже цитировавшуюся ранее статью Александра Авдуевского [3] или прекрасный сайт Андрея Кузина “VRML шаг за шагом” [4].

Краткая история VRML

VRML был создан Марком Песе (Mark Pesce) и Энтони Паризи (Anthony Parisi), которым позднее помогали Гэвин Белл (Gavin Bell) и Брайан Белендорф (Brian Behlendorf) [5]. Марк и Тони встретились в декабре 1993 года. Они оба работали над созданием трехмерного интерфейса для Web. И хотя для этого требовался новый язык, им не хотелось далеко уходить от HTML; кроме того, они пытались не изобретать свой язык с нуля. Рассмотрев несколько существующих в то время технологий, они остановили свой выбор на Open Inventor ASCII File Format компании Silicon Graphics Inc. (SGI). Добавив к реалистическим возможностям описания трехмерных сцен в Open Inventor сетевые расширения, авторы получили то, что им требовалось.

К середине февраля 1994 года была создана программа (ее назвали Лабиринт), которая на дисплее компьютера рисовала и закрашивала трехмерный банан. Месяцем позже Марк был приглашен на первую международную конференцию по World Wide Web в CERN в Женеве. После презентации на ней своего нового языка он совместно с Брайаном Белендорфом создал web-сайт с первым описанием VRML, что вызвало не менее тысячи откликов заинтересованных поклонников, которые горячо поддержали новую инициативу. Так начиналась эра VRML. Официальная презентация языка состоялась 3 апреля 1995 года, а спецификация версии 1.0 последовала в мае того же года; она была разработана Г.Беллом, Э.Паризи и М.Песе.

В определенном смысле версия 1.0 носила черновой характер: в ее спецификацию вообще не вошли команды для создания динамических VRML-сред, прежде всего потому, что авторы хотели закончить версию языка и запустить ее в работу максимально быстро. В мае 1996 года последовала версия 2.0 (первое время ее часто называли “Подвижные миры” — Moving Worlds, — подчеркивая тем самым ее главные преимущества), где было добавлено множество дополнительных возможностей, некоторые из которых являлись принципиально новыми:

  • дополнительные элементы управления геометрией и цветовые свойства форм;
  • атрибуты освещенности, такие, как Туман (fog);
  • узлы группировки, которые поддерживают объект Определение столкновения (collision detection);
  • информация о сцене для браузера;
  • определение и повторное использование объектов, а также эффективное добавление к сценам узлов из “библиотек”, используя прототипы PROTO и EXTERNPROTO;
  • возможности для организации движения объектов;
  • интерполяция цвета, позиции, ориентации и т.д. при создании динамических эффектов;
  • сенсоры для запуска этих эффектов;
  • поддержка источников звука.

К сожалению, версии 2.0 и 1.0 не слишком хорошо совместимы, что породило много практических проблем. Например, некоторые просмотрщики VRML принципиально отказываются понимать версию 1.0, а некоторые, напротив, воспринимают как ошибку синтаксис отдельных узлов версии 2.0. Подобная ситуация едва ли способствует популяризации просмотра VRML-файлов, тем более что само программное обеспечение вносит дополнительные особенности в этот процесс.

Наконец, еще через год после некоторого несущественного усовершенствования языка, его состояние было зафиксировано в версии VRML97 (стандарт ISO/IEC 14773), которая явилась наивысшей точкой его развития.

Стандарты всех версий языка легко найти в Интернете, поэтому здесь мы не будем приводить ссылок.

На практике вторая версия VRML была еще менее жизнеспособной, чем первая. Основной проблемой нового VRML стало то, что в 1997 году среднестатистические потребители компьютеров не могли приобрести ПК, способный отображать 3D-миры с адекватной скоростью, да и пропускная способность каналов не могла обеспечить требований передачи данных для виртуальных сцен. С точки зрения технических возможностей компьютеров VRML появился слишком рано, и это еще один пример отличной продукции, которую на пике популярности не продвинули и не распространили должным образом.

Позднее появлялись новые языки для описания 3D-объектов, но они не оставили такого следа, как VRML. В феврале 2002 года в США на Седьмой международной конференции трехмерных web-технологий “3D Web Technology” был впервые представлен расширяемый язык описания трехмерных сцен X3D (международный стандарт ISO/IEC FCD 19775:200x). Название языка X3D происходит от Extensible 4 3D, а сам он интегрирует в себе VRML и XML и имеет модульную конструкцию. Этот язык рассматривается как преемник VRML, так и не сумевшего широко внедриться в повседневную жизнь.

Завершая наш краткий исторический экскурс, стоит также дополнительно упомянуть о формате MPEG4. Это не просто формат кодирования видеофильмов, но и представления любой мультимедийной информации, включая трехмерную. Будучи мощным и комплексным форматом, в трехмерной части MPEG достаточно близок к VRML.

Во всех примерах нашей статьи мы будем пользоваться синтаксисом версии VRML97.

Впечатляющие примеры

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

В большинстве популярных публикаций про VRML мелькают фразы о многочисленности примеров в Интернете. Вот типичный выбранный наугад пассаж:

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

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

Во-первых, как мы помним из исторического экскурса, пик популярности VRML имел место примерно 10 лет назад. В результате многие ссылки, например на впечатляющие экскурсии по заграничным городам, сейчас оказываются “битыми”, т.е. web-страницы, на которые ведут ссылки, давно перестали существовать. Слова “заграничный” и “давно” в предыдущем предложении не являются существенными: неработающими, в частности, оказались и ссылки на виртуальный Петербург 5 , посвященные 300-летию города, которое, как мы помним, было совсем недавно.

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

В-третьих, wrl-файлы имели разные версии, что также обещанных виртуальных экскурсий не облегчало. Кроме того, опыт их просмотра показал, что некоторые программы отдельные узлы отображают некорректно или вообще игнорируют. Так, например, один из бесплатных автономных просмотрщиков, который я использовал, отказывался отображать большинство (но не все!) VRML-сцен версии 2.0, но неплохо справлялся с версией 1.0. При этом он начисто игнорировал все узлы вида AsciiText версии 1.0 и тем более Text версии 2.0. Добавлю, что снеговик, которого мы “изготовим” в качестве одного из примеров во второй части публикации, в данном вьюере вместо сфер оказывался состоящим из многогранников с весьма небольшим числом граней, т.е. был “страшно угловатым”.

Примечание. VRML является языком, чувствительным к регистру символов. Поэтому как бы ни странно выглядело написание AsciiText, оно сделано в полном соответствии с синтаксисом!

В-четвертых, многие примеры выглядели весьма по-дилетантски и не впечатляли вовсе. Таково было, в частности, посещение многообещающей экскурсии по Парижу, проходившей внутри каких-то залов под куполом; правда, возможно, это была только своеобразная “прихожая”, оттуда как-то можно было “телепортироваться” в другие сцены, но у меня этого не получилось, несмотря на активные манипуляции мышью.

Тем не менее значительные усилия, как правило, вознаграждаются. Не был исключением и мой поиск, в результате которого я попал на сайт “Виртуальный Мамаев курган” [6]. Сайт сразу привлек внимание профессиональным дизайном, а также наличием сравнительной таблицы по применению плагинов для просмотра объемных изображений, причем все характеристики ПО были приведены по состоянию на сентябрь 2007 г. (таблица эта представляет самостоятельный интерес и будет помещена в следующем разделе статьи).

Загрузив рекомендуемое программное обеспечение с сайта [7], я был приятно удивлен простотой его инсталляции. В результате без всяких дополнительных усилий я зашел на “Мамаев курган” и весь вечер там бродил, вспоминая свои реальные посещения города-героя Волгограда.

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

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

Расположенная в правом нижнем углу карта помогает не запутаться в поворотах, что на некоторых этапах случается.

Если вы не поленитесь загрузить и инсталлировать еще один 3D-плагин — Cortona3D фирмы Parallel Graphics [8], то сможете познакомиться с несколькими не менее интересными трехмерными проектами, о которых уже упоминалось выше [2] (более современные ссылки на них лучше брать с сайта [9]).

Примечание. Установку указанного плагина удобнее произвести с любого сайта, где он используется: в этом случае процедура будет максимально простой. Отмечу, что Blaxxun Contact и Cortona3D уживались в моем компьютере вполне дружно.

Вот детальная сцена подъема подводной лодки “Курск”. На рисунке приведен атомный крейсер “Петр Великий”, который принимал участие в этих работах. Сама лодка на данном этапе виртуального процесса пока лежит на дне, поэтому показать здесь ее вид по полиграфическим причинам было бы сложно.

На следующем рисунке вы видите один из нескольких возможных видов трехмерной демонстрации хода операции по затоплению российской орбитальной станции “Мир” [10]. Изображен момент включения двигателя для придания станции тормозящего импульса с целью организации ее схода с орбиты. Цифровые данные в правой части экрана свидетельствуют о том, что это не просто красивый объемный “мультфильм”, но честное физическое моделирование процесса: учитываются и контролируются параметры орбиты, скорость космического комплекса и прочие параметры моделируемой реальности.

А вот еще пример качественно выполненной трехмерной модели, взятый с сайта другого 3D-просмотрщика [11] (его самого, кстати, инсталлировать не удалось: он что-то требовал дополнительно поискать на сайте Microsoft). Перед нами — детализированное трехмерное помещение, в котором также можно перемещаться, осматривая находящиеся в комнате предметы. Обращает на себя внимание имитация в виртуальном мире многочисленных источников света — в комнате, кроме нескольких окон, есть еще электрическое освещение.

Взгляните также еще на одну иллюстрацию из этой серии — Виртуальный выставочный центр [12]. На нее обязательно стоит посмотреть как на некоторую индексную страничку 3D-сайта: щелкая по висящим на стене картинам, можно переходить к соответствующим материалам (в идеальном случае, конечно, тоже трехмерным!).

Вообще трехмерные выставки, галереи и музеи — это весьма распространенная в Интернете тематика. Я убедительно советую вам прочитать обзор [13], где описаны виртуальные музейные технологии и интересные примеры виртуальных музеев. К сожалению, иллюстрации самого обзора не являются объемными, а большинство ссылок “не отвечает”.

Тем, кто интересуется астрономией и освоением космоса, вероятно, стоит посетить сайт [14]. Его входная страничка содержит множество ссылок на объемные модели, связанные с Марсом и Солнечной системой. Ниже приводится пример одного из фрагментов, на котором можно наблюдать движение планет. К сожалению, весь контент дается на английском языке, хотя сайт явно русский, использующий зарубежные источники.

А поклонников химии и учителей этого предмета наверняка заинтересуют объемные модели молекул с сайтов [15, 16]. Вот, на мой взгляд, хороший пример, демонстрирующий структуру алмаза и графита. Как известно, они состоят из одних и тех же атомов, но разная пространственная структура придает им принципиально различные свойства.

Большой архив всевозможных VRML-файлов можно найти на сайте [17]. Сайт весьма запутанный по навигации, поэтому в тексте главной страницы поищите ссылку на “библиотеку готовых VRML-объектов и сцен”.

Наконец, никак нельзя пройти мимо виртуальной трехмерной стройплощадки [18].

Она привлекает вовсе не реализмом в изображении строительной техники и даже не выразительными стереоэффектами, но тем, что эта техника движется под управлением оператора. В нижней части экрана находятся пульты управления башенным краном (его “верхушка” на рисунке не показана), экскаватором и самосвалом. Ручки управления, которые вы там видите, легко управляются мышкой. В частности, экскаватор способен ехать, поворачивать кабину, а также копать землю, для чего можно управлять двумя подвижными сочленениями его стрелы и отдельно ковшом. При некотором навыке, видимо, можно нагрузить землей самосвал, отвезти ее в нужное место и вывалить (честно говоря, мне не хватило терпения научиться высыпать землю из ковша точно в кузов, но это не говорит о том, что это невозможно).

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

Необходимое ПО

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

Чтобы лучше понять роль программного обеспечения в отображении VRML-файлов, кратко рассмотрим последовательность создания 3D-изображения на экране компьютера.

Получение трехмерных иллюстраций обычно представляет собой трехступенчатый процесс: построение трехмерной модели (или моделей); применение атрибутов поверхностей и, наконец, рендеринг композиции в файл или отображение ее на экране. Четвертый (необязательный) шаг, который поддерживают многие трехмерные программы, — это анимация композиции. Первоначальный “каркас” модели (его часто называют wire — проволочный) выглядит примерно так.

Чтобы его “оживить”, на него накладываются поверхности, для реалистичности применяя к ним те или иные методы. Например, можно преобразовать простую плоскую поверхность в каменную стену с египетскими иероглифами, задав для нее подходящее растровое изображение, — этот процесс называется “наложение текстуры” (texture mapping). Сходный процесс, “наложение рельефа” (bamp mapping), позволяет вытягивать или гравировать поверхность, превращая ее в пересеченную местность с холмами и оврагами. В дальнейшем сцену можно улучшить, добавив источники освещения, задав расположение камеры или оживив фон изображения растровой картинкой либо текстурой. После этого можно приступать к рендерингу сцены. Рендеринг — это процесс, в результате которого двухмерная иллюстрация переходит в новое, трехмерное качество, наполненное правильным содержанием по всем трем плоскостям. Существует несколько способов рендеринга изображений, например, метод сканирования строк (scan-line) и метод трассировки лучей (ray tracing). Заметим, что создание трехмерной картины требует проведения огромного количества вычислений, причем даже для вполне современных компьютеров и не слишком сложных сцен речь может идти о часах машинного времени.

Во многих случаях после того, как 3D-программа создала вид трехмерной сцены на экране, его сохраняют в файл обычного графического формата. В результате вы получаете своеобразную фотографию, хотя и с трехмерной перспективой. Преимуществом подобной схемы является оперативность последующего просматривания изображения, но зато видеть вы его можете только с фиксированной точки. Важно отметить, что рендеринг при этом может быть сделан весьма сложным и высококачественным, поскольку его реализация происходит вне вашего компьютера. Технология VRML, напротив, требует, чтобы вы имели возможность оперативно менять точку просмотра сцены, а значит, все описанные выше процессы построения изображения должно производить ваше программное обеспечение на вашем компьютере (как образно говорят — “здесь и сейчас”).

Примечание. Если вы хоть немного интересовались работой трансляторов, то, читая предыдущее описание, не могли не вспомнить термины компиляция и интерпретация. Компилятор преобразует всю программу в некоторый эквивалент, после чего он уже не нужен. Интерпретатор, напротив, работает с программой постоянно, обрабатывая те ее части, которые в данный момент требуются. В этом смысле ПО для демонстрации VRML аналогично интерпретатору.

Из приведенной выше теории следует несколько (в основном неприятных) выводов. Во-первых, для просмотра VRML, особенно в динамике, требуется хороший компьютер (он должен успевать быстро “пересчитывать” картинку). Во-вторых, процессы создания трехмерного изображения нельзя сильно усложнять, а любое упрощение ради ускорения неизбежно ведет к ухудшению качества. Наконец, последний, имеющий самое непосредственное отношение к нашей теме, вывод заключается в том, что качество изображения (а иногда даже сам вид изображения!) во многом зависит от применяемого программного обеспечения и заложенных в него алгоритмов.

Перейдем к непосредственному выбору программного обеспечения. Как уже отмечалось ранее, хорошая сравнительная таблица ПО для просмотра VRML-миров, отражающая современное состояние в данной области, имеется на сайте [6].

Илон Маск рекомендует:  Что такое код krsort

Если внимательно прочитать расшифровку обозначений, то таблица не потребует особых комментариев. Отметим лишь, что многопользовательский режим — это поддержка возможности одновременного нахождения в виртуальном мире нескольких пользователей.

Обозначения: free — бесплатно; free* — условно бесплатно; trial — бесплатный испытательный период; Netscape-like — группа браузеров Netscape Navigator, Mozilla, Firefox, Opera; standalone — отдельное приложение, независимое от web-браузера; GPL — лицензия на свободное программное обеспечение.

Если вы заинтересовались отображением VRML более серьезно и ваши цели идут дальше, чем просто разделить с автором удовольствие от посещения описанных выше объемных миров, то, возможно, вам стоит изучить более масштабную таблицу подобного ПО [19]. К сожалению, она находится на англоязычном сайте, но непосредственно с таблицей в состоянии разобраться любой владеющий компьютерной терминологией пользователь.

Те читатели, которые выбрали для себя VRML-плагин Blaxxun Contact, могут дополнить его весьма интересным по идеологии “автономным” вьюером [20]. Идея его работы следующая. Установленный на вашем компьютере blaxxun Contact для своих нужд создает некоторый интерфейс API, которым и пользуется указанный просмотрщик. Проще говоря, данная программа способна работать без браузера, но при наличии установленного вышеуказанного плагина. Справедливости ради следует сказать, что вьюер [20] имеет несколько больше возможностей, чем браузер.

Интересными возможностями обладает вьюер Deep View [21]. Он не просто отображает VRML-сцену, что по определению делает любая программа такого класса, не только позволяет выделить отдельные объекты, из которых состоит объемное изображение (это тоже делают многие VRML-просмотрщики), но и весьма изящно предоставляет возможность отключать с помощью флажков ненужные элементы. В результате пользователь может выделить только те объекты мира, которые ему понравились, и даже сохранить такой “подправленный” мир, правда, в файле со специальным форматом.

Помимо программных средств для просмотра виртуальных миров, существует проблема ПО для их создания. Как вы, конечно, поняли, мы теперь говорим о той категории читателей, которые хотят не просто путешествовать по чужим мирам, но и создавать свои. Здесь тоже, как говорится, возможны варианты. Простейшие демонстрационные объемные сцены можно написать в обычном текстовом редакторе вроде Блокнота. В частности, примеры, разработанные для этой публикации, вполне можно реализовать на базе данной примитивной технологии. Для создания небольших миров уже потребуются программы-инструменты. В качестве простейшего из них автор хотел бы порекомендовать бесплатную программу под названием “Белая дюна” [22]. Программа имеет удобный интерфейс, который близок по структуре к итоговому VRML-тексту (см. левое поле на приведенном виде экрана).

Приемы работы с интерфейсом программы очень похожи на стандартные: например, правое поле до боли напоминает инспектор объектов Delphi или Visual Basic. Поле общего вида в центре чувствительно к мыши, так что объемные компоненты можно дополнительно перемещать “на глазок”, без всякого расчета координат. В Интернете имеется инструкция на русском языке. С моей точки зрения, удобством программы является также то, что она представляет собой единственный и автономный файл, прекрасно запускающийся безо всякой инсталляции, черта, которая в последнее время почти не встречается (а так порой хочется вспомнить старый MS-DOS, где установка ПО заключалась в простом копировании!). К сожалению, есть и недостаток — разработка программы еще не совсем завершена, так что не все сложные функции работают. Впрочем, один из наших примеров, к которым мы скоро перейдем, как видно из рисунка, в редакторе вполне удовлетворительно себя чувствует.

Чем больше ваши притязания в строительстве виртуальных миров, тем сложнее программное обеспечение, которое вам при этом потребуется. Вполне возможно, что бесплатного ПО вам найти уже не удастся. Заметим, что широкий набор средств для VRML-разработчика предлагает (к сожалению для системы образования, не бесплатно) фирма Parallel Graphics, о которой мы неоднократно вспоминали в связи с примерами сложных и впечатляющих трехмерных проектов. Существует также много других предложений, включая известные 3D-Max и Auto CAD, которые способны сохранить результаты работы в формате VRML.

На этом вводную часть публикации можно закончить. Надеюсь, под влиянием виртуальных экскурсий читатели полны решимости освоить основы VRML. А на рабочих столах их компьютеров уже красуются ярлыки 2–3 понравившихся им программ для обработки VRML. Для знакомства со второй половиной публикации все это пригодится.

5. Джамса К., Лалани С., Уикли С. Программирование в Web для профессионалов. Минск: ООО “Попурри”, 1997, 632 с.

NGK Spark Plugs (Eurasia) › Блог › Датчики MAP и MAF: расскажем подробнее

Начнем с главного и расшифруем загадочные аббревиатуры. Итак, датчик MAF (он же Mass Air Flow sensor) — датчик массового расхода воздуха (ДМРВ), важный элемент электронных систем управления двигателем в автомобилях с впрыском топлива. Датчик MAP (Manifold Absolute Pressuresensor) —датчик абсолютного давления (ДАД), расположенный во впускном коллекторе автомобилей. Абсолютно каждый современный автомобиль, который сходит с конвейера, оборудован либо одним из этих датчиков, либо датчиками MAP и MAF одновременно. А вот теперь перейдем к подробностям.

Датчик массового расхода воздуха (ДМРВ)

Функция ДМРВ
Является частью системы управления двигателем. Также его называют «датчиком потока воздуха» или «расходомером воздуха». Он устанавливается между воздушным фильтром и дроссельной заслонкой и определяет объем воздуха, проходящего через систему впуска дизельных и бензиновых двигателей внутреннего сгорания. Благодаря информации о количестве воздуха блок управления двигателем (ЭБУ) может определять оптимальное соотношение и подавать необходимый объем топлива в двигатель.

В настоящее время большинство датчиков MAF выпускается в двух исполнениях: с нагреваемой нитью или нагреваемой пленкой.

Принцип работы ДМРВ с нагреваемой нитью
Датчик MAF с нагреваемой нитью имеет измерительный элемент, нагреваемый с помощью электричества до температуры на 75 — 100C выше температуры воздуха на впуске. Когда поток воздуха проходит через измерительный элемент, он охлаждает элемент и повышает ток, необходимый для поддержания высокой температуры элемента. Сила тока, необходимая для поддержания высокой температуры, пропорциональна количеству воздуха, поступающего в двигатель.

Принцип работы ДМРВ с нагреваемой пленкой (вариант I)
Принцип действия датчика MAF с нагреваемой пленкой схож с технологией нагреваемой нити. Нагревательный элемент в виде тонкой пленки нагревается до определенной температуры относительно температуры воздуха на впуске. При отсутствующем потоке воздуха происходит рассеивание тепла благодаря теплопроводности воздуха. При движении воздуха теплоотдача линейно возрастает вместе с расходом воздуха. Исходя из силы тока, необходимого для нагрева, электроника способна вычислить массу воздуха.

Принцип работы ДМРВ с нагреваемой пленкой (вариант II)
Вариант датчика MAF с нагреваемой пленкой имеет 2 измерительных элемента, между которыми размещен нагреваемый керамический элемент. Когда двигатель не эксплуатируется и воздушный поток отсутствует, тепло равномерно распределяется в двух датчиках. Оба датчика выдают одинаковую температуру воздуха. Когда двигатель работает, воздух на впуске проходит от Т1 в сторону Т2 через чувствительный элемент, воздух охлаждает датчик Т1. Воздух нагревается над нагревательным элементом, поэтому датчик Т2 охлаждается меньше Т1. Исходя из разницы в температурах между датчиками Т1 и Т2 электроника способна вычислять массу воздуха.

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

На основании данных, получаемых с датчика, блок управления двигателем (ЭБУ) определяет длительность открытия топливных форсунок, а соответственно — вычисляет необходимый объем топлива, чтобы поддерживать стехиометрическое соотношение топлива и воздуха в том или ином режиме работы двигателя. Нормальный стехиометрический состав смеси (когда она не богатая и не бедная) 14,7:1. То есть в цилиндр подается 14,7 частей воздуха и 1 часть топлива от общего состава смеси.

В ассортименте компании NGK | NTK представлено 57 ДМРВ с нагреваемой нитью и 117 датчиков с нагреваемой пленкой. Однако не всегда при выходе из строя датчика с нагреваемой пленкой требуется замена элемента в сборе. В большинстве случаев происходит поломка чувствительного механизма датчика. Одним из ключевых преимуществ покупки комплектующих производства NGK | NTK является возможность замены сенсора в отдельности, без необходимости доплачивать за деталь вместе с корпусом. В каталогах NGK | NTK представлено 25 вставных сенсоров, которые обеспечивают применимость почти к 80 разным корпусам.

Датчик абсолютного давления (ДАД)

Функция ДАД
Устанавливается на впускной коллектор и отправляет необходимые сигналы в блок управления двигателем (ЭБУ). На основании этих параметров ЭБУ управляет углом опережения зажигания и корректирует работу двигателя.

Принцип работы ДАД
Принцип работы основан на подсчете вакуума, образуемого двигателем в процессе
Двигаясь в спокойном режиме, когда дроссельная заслонка немного приоткрыта и не требуется никаких резких ускорений или нагрузок на двигатель, потребление воздуха двигателем крайне мало, а разрежение, создаваемое внутри, имеет достаточно большое значение. При таких условиях работы, датчик MAP отправляет сигнал на блок управления двигателем, который, опираясь на топливные карты, заставляет его работать с меньшим потреблением топлива.
Когда двигатель работает на высоких оборотах и дроссельная заслонка полностью открыта, разрежение падает. Двигатель потребляет больше воздуха и требуется больше топлива. В нагруженном режиме работы двигателя, смесь намеренно делается богаче, а зажигание позднее.

Что точнее — MAP или MAF

Однозначный ответ на этот вопрос так и не найден.

• Датчики MAP в совокупности с датчиками температуры не способны замерить фактический объем воздуха, зашедший в цилиндры. Датчики MAF замеряют фактический массовый расход воздуха, однако они имеют ограниченный рабочий диапазон, что особенно сказывается при очень низком или, наоборот, высоком расходе топлива.

• Датчик MAP требует перекалибровки при каждом внесении изменений в конструкцию двигателя. Однако MAF при этом капризнее к окружающим условиям и загрязнениям.

Объединяет два вида датчиков производства NGK | NTK ключевое преимущество — неизменно высокое качество комплектующих, не поддающееся компромиссам. Датчики в полной мере соответствуют стандартам современных производителей, а в их конструкции не допускается ни малейшего отклонения в производственных процессах или какого-либо упрощения механизмов, что зачастую является отличительным признаком более дешевых аналогов сомнительного производства. Вмешательство в оригинальную конструкцию могут привести к проблемам с совместимостью и ошибкам в системе управления двигателем.

Каждый датчик производства NGK | NTK проходит длительное тестирование: температурные испытания и проверки на соответствие заявленного ресурсу, который гарантирует производитель, а также соответствие параметров электрики.

Анимация SVG-элемента path

Думаю многие видели обзоры игровых консолей нового поколения от Polygon (Vox Media). Это те, где консоли отрисовывались в стиле blueprint’ов:

Stroke-dasharray interpolation, теория

Вообще техника подобной анимации линий не нова, просто до недавнего времени SVG и всё, что с ним связано, на мой взгляд, было несправедливо предано забвению, но к счастью ситуация меняется. Итак, трюк с анимацией элемента path возможен благодаря свойству stroke-dasharray элемента path . Это свойство позволяет задавать параметры пунктирной линии, а именно длину штриха и промежутка между штрихами. Если задать длину штриха равной всей длине линии, то получим обыкновенную сплошную линию. Если же задать длину штриха равной нулю, а длину промежутка опять-таки равной всей длине линии, то получим невидимую линию. А постепенно увеличивая длину штриха при длине промежутка, равной длине всей линии, мы можем имитировать её отрисовку. При таком подходе отрисовка будет происходить от начала линии. Если же вдруг необходимо отрисовывать с конца, то нужно использовать ещё одно свойство: stroke-dashoffset. Это свойство определяет смещение для первого штриха. Таким образом, уменьшая смещение и увеличивая длину штриха, получим отрисовку с конца линии.

Ребята из Vox Media использовали гибридный вариант (который, на мой взгляд, избыточен), кстати почитать о том, как они это делали, можно (и нужно) в их блоге: Polygon feature design: SVG animations for fun and profit.

Реализация SVG анимации

В Vox Media предлагают использовать requestAnimationFrame для плавности анимации, но у нас немного другие цели, так что мы пойдём более простым путём, воспользуемся библиотекой D3.js и реализованной в ней анимацией на основе длительности.

Вот собственно рабочий код, использовавшийся для анимации консоли из начала статьи.

В функции transition(path) мы используем transition.attrTween(name, tween), который вызывает интерполятор, определённый в функции tweenDash() . Для вычисления длины используется метод getTotalLength(), определённый для элементов SVG path . Затем с помощью d3.interpolateString(a, b) задаётся интерполятор свойства stroke-dasharray , который выполнит интерполяцию значений от stroke-dasharray: 0,l; до stroke-dasharray: l,l; (здесь первое значение задаёт длину штриха, а второе длину промежутка). Посмотреть на то как это работает можно на bl.ocks.org: PlayStation 4: SVG animation.

Думаю вы заметили, что часть элементов отображается постоянно, это происходит потому, что они нарисованы не с помощью path . Вообще подготовка и оптимизация векторных изображений для web это довольно обширная тема с массой нюансов, тянущая на отдельную статью.

Движение вдоль элемента path

У path есть ещё один весьма полезный метод — getPointAtLength(distance in float). Он позволяет получить координаты точки, находящейся на заданной дистанции от начала линии. С помощью него можно реализовать движение какого-либо маркера вдоль линии, и, что немаловажно, плавное вращение за счёт вычисления касательной к имеющейся линии.

Начнём просто с движения вдоль линии, пока без вращения.

Здесь pathStartPoint(path) вытаскивает координаты начала линии из атрибута d элемента path . В translateAlong(path) с помощью интерполятора задаются координаты нашего маркера. Пример можно посмотреть здесь: Marker animation along SVG path element with D3.js. А ещё можно объединить анимацию отрисовки линии и движение маркера, выглядеть это может следующим образом: Marker animation along SVG path element with D3.js II.

Усложним задачу, добавим вращение (ну и поменяем маркер с круга на что-нибудь поинтереснее). В качестве маркера у нас будет ракета с шириной 48 и длиной 24 . Поскольку по умолчанию точкой привязки маркера является левый верхний угол, нам необходимо смещать его, чтобы привязка была к центру маркера. Также необходимо учитывать это при вращении, ведь оно тоже по умолчанию происходит вокруг левого верхнего угла. Со смещением вроде разобрались. Теперь перейдём непосредственно к вращению, здесь нам поможет определение касательной, угол будем определять с помощью арктангенса.

Функция translateAlong(path) , определяющая интерполятор будет выглядеть следующим образом:

Где и для чего это можно использовать

Во-первых, для достижения интересного эффекта с точки зрения дизайна. Можно отображать объекты по мере скроллинга, можно делать анимацию текста, правда надо учитывать что по умолчанию каждая буква — это отдельный элемент path , да много чего можно придумать.

А можно использовать с практической точки зрения, например для анимации движения по маршрутам на схемах и планах (анимация стрелочек и прочее). А ещё для инфографики, тут масса вариантов, если грамотно использовать можно весьма эффективно управлять вниманием читателя.

На этом всё. Пробуйте, экспериментируйте, созидайте — всё в ваших руках. И пусть в наступившем году вам сопутствует удача.

Язык моделирования виртуальной реальности VRML

VRML — Virtual Reality Modeling Language (язык моделирования виртуальной реальности) уже довольно давно применяется в сети Интернет. Он признан Web- консорциумом для описания интерактивной трехмерной графики и мультимедийных приложений и стандартизирован (ISO/IEC 14772). VRML- документ представляет собой обычный текстовый файл, который содержит описания трехмерных фигур и свойств их поверхностей (цвет, текстура, освещение и т.п.).Такой документ поступает в браузер в виде исходного текста, точно так же, как и обычный HTML-документ. Браузер, получающий VRML-документ, должен уметь интерпретировать VRML-код.

Язык VRML был впервые предложили Марк Песк (Mark Pesce), Питер Кеннард (Piter Kennard) и Энтони Париси (Anthony S. Parisi) в мае 1994 г/ на Первой международной конференции по WWW, а его первая спецификация (VRML 1.0) была подготовлена на основе формата Open Inventor фирмы SGI (Silicon Graphics), и впервые представлена на Второй конференции WWW в октябре 1994 г.

Виртуальная реальность состоит из блоков VRML, которые называются мирами VRML. Спецификация языка представляет собой набор команд, называемых элементами (nodes) и предназначенных для создания простых объектов типа сферы, куба или цилиндра, а также объектов, состоящих из наборов вершин (vertices) и сторон (faces).

Язык VRML позволяет создавать более сложные объекты путем комбинации простых объектов. Это иерархический язык — порожденные или дочернии (child) объекты наследуют свойства родительских (parent) объектов. Для определения местоположения и отношений различных объектов между собой требуется указание их относительных размеров и координат VRML. В дополнение к этому язык позволяет определить освещение в вашем мире, а также предварительно установленные пейзажи.

Версия языка 1.0 была статичной. Изменялось лишь место расположения зрителя при его передвижении по виртуальному пространству. VRML 2.0 позволяет создавать динамические миры, благодаря значительному расширению егоинтерактивных возможностей. Стандарт VRML 2.0 поддерживает анимацию и звуковые эффекты; для него существует поддержка на уровне языков Java и JavaScript. VRML 2.0 был рассмотрен открытой дискуссионной группой и одобрен многими компаниями, а в августе 1996 года был принят его стандарт. В декабре 1997 года VRML 2.0 был официально заменен на VRML 97 (называемый также VRML Technical Symposium), который был впервые представлен в феврале 1997 года в Монтерее (Калифорния, США). Новый стандарт ISO/IEC 14772 практически идентичен спецификациям VRML 2.0 с учетом редакционных поправок и некоторых незначительных функциональных различий. Таким образом, текущим VRML- стандартом является VRML 97, а в работе находится новый формат — VRML 200х.

VRML-программу можно сделать оптимальной и более корректной, улучшив скорость отображения и время транспортировки. Добиться этого можно следующим путем: так как VRML-файлы текстовые, можно достичь высокой степени их сжатия утилитой упаковки данных. Например, wrl-файл размером 358 Кб может быть уменьшен до 69 Кб, т.е. сжат приблизительно в 5 раз. Крайне нежелательно, чтобы время, затрачиваемое на распаковку файла, составляло значительную долю в общей сумме временных затрат от начала транспортировки по сети до момента его отображения. Поэтому интересно сравнить время, затрачиваемое натранспортировку и распаковку виртуальных миров, со временем передачи по сети несжатого VRML-файла.

Виртуальная модель ИТМО (ТУ)

При моделирования целесообразно выполнять следующие рекомендации:

1. Не создавайте невидимые объекты (объекты внутри объектов);

2. Используйте примитивы, а не многоугольники, т.к. многие VRML-роузеры содержат алгоритмы, позволяющие отображать примитивы (конус, куб, цилиндр и сфера) намного быстрее, чем объект, состоящий из многоугольников. Экономия вычислительных ресурсов очевидна на примере примитива типа сфера, имеющего только один параметр — радиус. По сравнению с объемом информации, необходимой для создания сфероподобного многоугольника, выгода огромна.

3. Используйте как можно меньше многоугольников. Большинство экспертов по VRML при создании виртуального мира задействует не более 10000 многоугольников.

Не нашли то, что искали? Воспользуйтесь поиском:

Единицы измерения. В VRML приняты следующие единицы измерения: Заголовок файла в VRML97. Каждый файл с кодом VRML97 должен начинаться строкой

    Святослав Озеров 2 лет назад Просмотров:

1 VRML файлы имеют расширения wrl (от слова world — «мир») или wrz. В обоих случаях файл может быть либо текстовым (содержащим непосредственно код), либо gzip-архивом. Единицы измерения В VRML приняты следующие единицы измерения: Расстояние и размер: метры Углы: радианы Остальные значения: выражаются, как часть от 1. Координаты берутся в трехмерной декартовой системе координат (см. рис.) Z-координата направлена из экрана. Причем объект определяется только снаружи. Изнутри вид объекта стандартом не определен и зависит от браузера. Заголовок файла в VRML97 Каждый файл с кодом VRML97 должен начинаться строкой #VRML V2.0 utf8 Такой заголовок обязательно должен находиться в первой строке файла, кроме того, перед знаком диеза не должно быть пробелов. Все строки, кроме первой, начинающиеся значком #, считаются комментариями. Операторы, из которых состоит код, называются узлами (node). В общем виде это выглядит примерно так «название узла <аргументы". В ряде случаев вместо фигурных скобок могут стоят квадратные "[]". Box (паралеллепипед) Box

4 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 #VRML V2.0 utf8 Shape

14 При attenuation При attenuation

16 Во внутреннем конусе (с углом beamw >

18 Или то же самое можете посмотреть в VRML. У Вас есть две пары параметров: skyangle/skycolor и groudangle/groundcolor. Первая пара — это как бы «небо» и раскрашивается сверху вниз (т.е.skyangle=0 — вертикально над Вами), а вторая пара — это как бы «земля» и раскрашивается снизу вверх (т.е. groundangle=0 — вертикально под Вами). Смотри рис. Как видно из рисунка, skyangle изменяется от 0 до Пи, а groundangle — от 0 до Пи/2, и при этом интервалы их изменения перекрываются. Зачем вообще введена пара groundangle/groundcolor непонятно, поскольку можно обойтись одной только парой skyangle/skycolor. Возможно, это сделано, чтобы легче было организовать четкую линию горизонта между «небом» и «землей», хотя, горизонт можно сделать и раскрашивая одно только «небо»! Количество значений параметраcolor должно быть на 1 больше числа значений параметра Angle. Если Вы указали соседние кольца разных цветов, то на их границе цвет интерполируется для плавного перехода.

20 умолчанию 1.6) определяет, насколько свысока Вы смотрите на сцену (если только в явном виде не указано положение Viewpoint — см ниже), а третий параметр (на картинке — s, по умолчанию 0.75) определяет насколько высокие объекты Вы можете «перешагнуть» сверху, не уткнувшись в них. Подводя итог с учетом того, что размеры указаны в метрах, можно сказать, что по умолчанию у Вас странная комплекция: цилиндрическое тело диаметром 25 сантиметров, Ваши глаза находятся на уровне 1 метр 60 сантиметров, а ногу Вы можете оторвать от пола на 75 сантиметров. Еще одна величина, приведенная на картинке, — v — соответствует параметру visibilitylimit в описании узла и определяет, как далеко Вы видите. Рендеринг за пределами visibilitylimit НЕ ПРОВОДИТСЯ. Выставленный по умолчанию visibilitylimit=0 соответствует бесконечному пределу. Параметр speed задает скорость перемещения по миру, но обычно броузеры содержат свои настройки на этот счет, которые игнорируют содержимое файла. Скорось дается в м/с и единственная интересная вещь в этом параметре — это speed=0, когда Вы сможете только крутиться на месте и никуда не уйдете. Оставшийся параметр type определяет, какими кнопками навигации Вы сможете пользоваться при просмотре. Возможные значения параметра type: «ANY», «WALK», «EXAMINE», «FLY», «NONE». Собственно, способа исследования сцены всего 3: «WALK» — «ходьба», «FLY» — «полет» (отличается от «ходьбы» отсутствием гравитации, т.е. траектория движения аватара не повторяет рельеф, НАД которым он движется, «EXAMINE» — «изучение» (Вы не движетесь, а движением мышки вращается сцена, этот способ удобен, для осмотра одного отдельного объекта). Очень важное слово «ANY» задает, можно ли пользоваться для навигации кнопками броузера. Если в списке параметра type есть «ANY», то в любой момент Вы можете просто переключиться с одного способа навигации на другой кнопкой броузера, если в списке нет «ANY», тогда остаются только те способы, которые перечислены в параметре type. Так, можно запретить «ходить» и «летать» в сцене, а оставить зрителю только возможность покрутить объект. Так должно быть, но обычно кнопки броузера все-таки продолжают работать. Единственно, что можно извлечь из этого параметра, — какой из способов навигации будет выставлен после загрузки сцены. Но что точно работает, так это значение «NONE», когда выключается целиком панель управления броузера. Это применяется, когда у Вас в сцене предусмотрена собственная система навигации: anchor’ы, viewpoint’ы и т.д. Viewpoint (точки обзора)

Илон Маск рекомендует:  Dos fn 2fh дать адрес текущей dta

26 starttime 0 stoptime 0 eventout cycletime eventout fraction_changed eventout isactive eventout time Исключительно важный узел. В 90 процентах случаев Вы не обойдетесь без него при организации анимации, поскольку именно здесь можно регулировать СКОРОСТЬ протекания процессов. Обратите внимание, что по умолчанию выставлено enabled TRUE. Это означает, что если Вы не указали в явном виде enabled FALSE (а также не меняли полеstarttime 0), то после загрузки сцены TimeSensor сразу начинает генерировать разнообразные eventout’ы! Т.е. по умолчанию TimeSensor НЕ ПРИХОДИТСЯ АКТИВИРОВАТЬ, и этим он принципиально отличается от остальных узлов-сенсоров. Не забудьте, что кроме поля enabled, есть поля starttime и stoptime, которые имеют больший приоритет, чем enabled. Но об этом — чуть позднее. А пока разберемся с остальными полями. Цикл работы TimeSensor’а может быть либо один (loop FALSE) либо при loop TRUE циклов будет много, (бесконечно, если stoptime меньше, чемstarttime, иначе пока не наступит stoptime). Длительность цикла задается полем cycleinterval. Что же происходит хронологически? Если starttime=0, то как только TimeSensor активирован (при enabled TRUE — сразу после загрузки, а при enabled FALSE — после получения сообщенияtimesensor.enabled), генерируются следующие eventout’ы: eventout isactive Посылается значение TRUE до тех пор, пока TimeSensor не будет деактивирован eventout cycletime Посылается в момент наступления starttime и в начале каждого последующего цикла при loop TRUE. eventout time Посылает абсолютное значение времени, прошедшего с начала цикла. eventout fraction_changed В отличие от eventout time посылает ОТНОСИТЕЛЬНОЕ значение степени завершенности цикла: в начале цикла fraction_changed=0, в конце цикла fraction_changed=1. Это один из наиболее часто используемых eventout’ов. При loop TRUE почти всегда используется волшебная связка.fraction_changed -.set_fraction -.value_changed,

27 где.fraction_changed — это часть от TimeSensor,.set_fraction — часть от интерполятора,.value_changed — часть от узла, у которого изменяются свойства. Теперь поговорим о starttime и stoptime. Как известно, в сетевых технологиях счет времени ведется с 00:00:00 1 января 1970 года, и значения полей starttime и stoptime в том числе. Но поскольку эти значения надо указать в секундах (т.е. сколько прошло с 00:00:00 1 января 1970 года), то чтобы пользоваться этими замечательными средствами управленияtimesensor’а не обойтись без маленького скрипта. Просмотр. Пришлось перевести миллисекунды в секунды (поделить на 1000), ВЫВОД: никогда не связывайтесь с вычислением в явном виде абсолютных значений при измерении времени (time, starttime, stoptime)! А если Вам нужно запустить анимацию в определенное время, пользуйтесь средствами, работающими с относительными значениями (cycleinterval). И тут есть два противоположных случая: первый — если после запуска в определенное время далее анимация циклично повторяется (loop TRUE), второй — если после запуска в определенное время анимация должна совершиться ОДИН РАЗ. 1. Первая задача решается очень легко. Посмотрите пример и поймете сами: Просмотр. Шарик начнет двигаться через 4 секунды после открытия файла и будет двигаться бесконечно! 2. Вторая задача несколько сложнее, поскольку нам необходимо получить сигнал set_starttime. Кто разберется в примере, надеюсь оценит идею. Просмотр. Шарик начинает двигаться через 4 секунды и движется 5 секунд. TouchSensor TouchSensor < enabled TRUE eventout hitnormal_changed eventout hitpoint_changed eventout hittexcoord_changed eventout isactive eventout isover eventout touchtime

28 Хороший сенсор, обычно используемый для большей интерактивности: чтобы что-нибудь открылось/закрылось/заработало и т.д. приходится навести курсор или щелкнуть на чем-нибудь мышкой. Поле у узла всего одно enabled TRUE/FALSE, а сам сенсор привязывается ко всем объектам, объединенным с TouchSensor’ом в одну parent группу. Работа сенсора начинается с момента наведения курсора мыши (или другого манипулятора) на объект, к которому привязан TouchSensor. При этом начинает генерироваться eventout isover TRUE. А кроме того при перемещении курсора над поверхностью объекта генерируются eventout hitnormal_changed(отслеживается положение вектора нормали к поверхности объекта), eventout hitpoint_changed (отслеживаются координаты точки на поверхности объекта, над которой находится курсор), eventout hittexcoord_changed (отслеживается положение точки на поверхности объекта, над которой находится курсор в координатах texture map). Оставшиейся два eventout’a eventout isactive и eventout touchtime генерируются при участии кнопки мыши: isactive TRUE генерируется только до тех пор пока Вы держите кнопку мыши НАЖАТОЙ (а после отпускания isactive FALSE), а eventout touchtime наоборот генерируется КАК ТОЛЬКО Вы ОТПУСКАЕТЕ кнопку мыши. Наиболее употребительными мне представляются isover, isactive и touchtime Просмотр. VisibilitySensor VisibilitySensor < center enabled TRUE size eventout entertime eventout exittime eventout isactive Этот сенсор определяет, находится ли в поле зрения область пространства внутри параллелепипеда с центром в center и размером size. Как только область становится видимой, генерируется eventout entertime и isactive становится TRUE. Как только Вы "отвернулись" и не

32 каждый cycleinterval интерполятор пробегает все значения полей key и keyvalue. Все узлы-интерполяторы (ColorInterpolator, CoordinateInterpolator, NormalInterpolator, OrientationInterpolator, PositionInterpolato, ScalarInterpolator) записываются одинаково: eventin set_fraction key [набор контрольных точек] keyvalue [набор значений, соотвествующий точкам в поле key] eventout value_changed Отличия заключаются только в ТИПЕ значения, отсылаемого через eventout value_changed. Если число значений в поле keyvalue не соответствует количеству контрольных точек в поле key, результат не определен. Важно помнить, что значения keyvalue в ПРОМЕЖУТОЧНЫХ точках между указанными контрольными точками интерполируется ЛИНЕЙНО! Т.е. если Вы, скажем, хотите организовать поступательное движение объекта по дуге, нужно быть внимательным, вводя большое количество точек в поле key (и соответственно в полеkeyvalue), поскольку движение будет аппроксимироваться ломаной. ColorInterpolator

34 eventout value_changed Нетрудно догадаться, что OrientationInterpolator позволяет организовать вращение. Только не забывайте, что значения ПРОМЕЖУТОЧНЫЕ междуkeyvalues вычисляются из ЛИНЕЙНОЙ интерполяции. Просмотр.

Exporting to VRML97

3ds Max scenes can be exported to VRML97 file format. 3ds Max exports .wrl files, which can be viewed in any VRML97 browser.

Make sure that you have the most current version of your VRML browser and check its documentation to make sure that it supports VRML97.

You can find the complete VRML97 specification at http://www.web3d.org/x3d/vrml/index.html. This document describes the entire VRML97 language and provides technical details on the behavior of exported VRML97 worlds.

The VRML97 exporter supports the following:

All VRML97 light types: direct, omni, and spot.

Free and targeted cameras.

Sphere, cone, box, and cylinder primitive objects. These objects export as VRML97 primitive objects. This helps reduce the size of VRML97 files.

All position, rotation, and scale animation on objects, as well as animated hierarchies, inverse kinematics, and all controller types. Select Coordinate Interpolators in the Export dialog to export animated meshes, such as an animated Bend modifier or character studio Physique animations.

To set up a VRML scene using 3ds Max :

  1. Create the objects that make up the scene.
  2. On the Create panel, turn on (Helpers).
  3. Use the tools in the VRML97 Helpers to add actions and triggers and prepare the scene.
  4. Export the scene to the VRML97 format.
  5. Open the VRML97 file in the browser and test it.

To export a file to VRML97:

  1. Choose Application menu Export.
  2. Choose VRML97 (WRL) as the file format.
  3. Enter a file name, and click Save.
  4. In the VRML97 Exporter dialog, set options as described below.

Turning on any of these options increases the size of the VRML97 file generated by the export process.

If your animations aren’t exporting correctly, try exporting with this option chosen. An example of animation motion requiring Coordinate Interpolators is a stick figure made up of simple rectangular boxes that have bones Linked to the boxes as a skeleton. Even though these boxes move through space without any noticeable shape morphing, their motion will not be exported without the use of Coordinate Interpolators, because their motion isn’t derived from simple transforms. Any animation achieved using the modifier stack or object parameters needs Coordinate Interpolators. This includes animated XForm modifiers.

Certain types of animations are not possible with Coordinate Interpolators; for example, when the mesh being animated changes size between frames. An example of this is animating the number of segments in a sphere. 3ds Max warns you if it detects this type of animation on export.

test.txt contains general info, start/stop times, and number of frames.

test0.wrl through test4.wrl are snapshots of the animation in frames 0 through 4.

All scenes should have at least one camera, so you can control how the scene initially renders. Add more cameras to the scene than you might ordinarily use, so the viewer can switch between cameras if his VRML97 browser allows it. This lets you set up your scene with pre-installed vantage points. Otherwise, if the world is very large, it can overpower the viewer’s system and make navigation difficult. Some browsers animate camera moves, so the extra cameras can make viewing the scene more pleasant.

Vertex Color Source group

Lets you choose the source for the vertex color when Color Per Vertex is turned on.

  • Use Max’s Exports the current vertex color of the object defined in the scene.
  • Calculate on Export Calculates the diffuse color at the vertices during export, based on the current lighting and the objects’ materials.

Bitmap URL Prefix group

Lets you specify a URL prefix for bitmaps assigned to objects in the scene. You must keep all your texture bitmaps in either the same directory as the WRL file or in one other location, which you specify here. If your maps are stored in other locations, you will have to manually search for the map in the WRL and change its location. Not all browsers will display error messages if the maps aren’t found on the WWW server.

Use forward slashes (not backslashes) to enter longer paths; for example: Myfiles/maps.

Topics in this section

The tips presented in this topic will help you make your work look as good as possible and display and move as fast as possible.

The VRML97 helpers let you create online 3D scenes and interaction using Virtual Reality Markup Language. Insert a VRML 97 Helper into the scene by clicking and dragging at the desired location.

Единицы измерения. В VRML приняты следующие единицы измерения: Заголовок файла в VRML97. Каждый файл с кодом VRML97 должен начинаться строкой

    Святослав Озеров 2 лет назад Просмотров:

1 VRML файлы имеют расширения wrl (от слова world — «мир») или wrz. В обоих случаях файл может быть либо текстовым (содержащим непосредственно код), либо gzip-архивом. Единицы измерения В VRML приняты следующие единицы измерения: Расстояние и размер: метры Углы: радианы Остальные значения: выражаются, как часть от 1. Координаты берутся в трехмерной декартовой системе координат (см. рис.) Z-координата направлена из экрана. Причем объект определяется только снаружи. Изнутри вид объекта стандартом не определен и зависит от браузера. Заголовок файла в VRML97 Каждый файл с кодом VRML97 должен начинаться строкой #VRML V2.0 utf8 Такой заголовок обязательно должен находиться в первой строке файла, кроме того, перед знаком диеза не должно быть пробелов. Все строки, кроме первой, начинающиеся значком #, считаются комментариями. Операторы, из которых состоит код, называются узлами (node). В общем виде это выглядит примерно так «название узла <аргументы". В ряде случаев вместо фигурных скобок могут стоят квадратные "[]". Box (паралеллепипед) Box

4 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 #VRML V2.0 utf8 Shape

14 При attenuation При attenuation

16 Во внутреннем конусе (с углом beamw >

18 Или то же самое можете посмотреть в VRML. У Вас есть две пары параметров: skyangle/skycolor и groudangle/groundcolor. Первая пара — это как бы «небо» и раскрашивается сверху вниз (т.е.skyangle=0 — вертикально над Вами), а вторая пара — это как бы «земля» и раскрашивается снизу вверх (т.е. groundangle=0 — вертикально под Вами). Смотри рис. Как видно из рисунка, skyangle изменяется от 0 до Пи, а groundangle — от 0 до Пи/2, и при этом интервалы их изменения перекрываются. Зачем вообще введена пара groundangle/groundcolor непонятно, поскольку можно обойтись одной только парой skyangle/skycolor. Возможно, это сделано, чтобы легче было организовать четкую линию горизонта между «небом» и «землей», хотя, горизонт можно сделать и раскрашивая одно только «небо»! Количество значений параметраcolor должно быть на 1 больше числа значений параметра Angle. Если Вы указали соседние кольца разных цветов, то на их границе цвет интерполируется для плавного перехода.

20 умолчанию 1.6) определяет, насколько свысока Вы смотрите на сцену (если только в явном виде не указано положение Viewpoint — см ниже), а третий параметр (на картинке — s, по умолчанию 0.75) определяет насколько высокие объекты Вы можете «перешагнуть» сверху, не уткнувшись в них. Подводя итог с учетом того, что размеры указаны в метрах, можно сказать, что по умолчанию у Вас странная комплекция: цилиндрическое тело диаметром 25 сантиметров, Ваши глаза находятся на уровне 1 метр 60 сантиметров, а ногу Вы можете оторвать от пола на 75 сантиметров. Еще одна величина, приведенная на картинке, — v — соответствует параметру visibilitylimit в описании узла и определяет, как далеко Вы видите. Рендеринг за пределами visibilitylimit НЕ ПРОВОДИТСЯ. Выставленный по умолчанию visibilitylimit=0 соответствует бесконечному пределу. Параметр speed задает скорость перемещения по миру, но обычно броузеры содержат свои настройки на этот счет, которые игнорируют содержимое файла. Скорось дается в м/с и единственная интересная вещь в этом параметре — это speed=0, когда Вы сможете только крутиться на месте и никуда не уйдете. Оставшийся параметр type определяет, какими кнопками навигации Вы сможете пользоваться при просмотре. Возможные значения параметра type: «ANY», «WALK», «EXAMINE», «FLY», «NONE». Собственно, способа исследования сцены всего 3: «WALK» — «ходьба», «FLY» — «полет» (отличается от «ходьбы» отсутствием гравитации, т.е. траектория движения аватара не повторяет рельеф, НАД которым он движется, «EXAMINE» — «изучение» (Вы не движетесь, а движением мышки вращается сцена, этот способ удобен, для осмотра одного отдельного объекта). Очень важное слово «ANY» задает, можно ли пользоваться для навигации кнопками броузера. Если в списке параметра type есть «ANY», то в любой момент Вы можете просто переключиться с одного способа навигации на другой кнопкой броузера, если в списке нет «ANY», тогда остаются только те способы, которые перечислены в параметре type. Так, можно запретить «ходить» и «летать» в сцене, а оставить зрителю только возможность покрутить объект. Так должно быть, но обычно кнопки броузера все-таки продолжают работать. Единственно, что можно извлечь из этого параметра, — какой из способов навигации будет выставлен после загрузки сцены. Но что точно работает, так это значение «NONE», когда выключается целиком панель управления броузера. Это применяется, когда у Вас в сцене предусмотрена собственная система навигации: anchor’ы, viewpoint’ы и т.д. Viewpoint (точки обзора)

26 starttime 0 stoptime 0 eventout cycletime eventout fraction_changed eventout isactive eventout time Исключительно важный узел. В 90 процентах случаев Вы не обойдетесь без него при организации анимации, поскольку именно здесь можно регулировать СКОРОСТЬ протекания процессов. Обратите внимание, что по умолчанию выставлено enabled TRUE. Это означает, что если Вы не указали в явном виде enabled FALSE (а также не меняли полеstarttime 0), то после загрузки сцены TimeSensor сразу начинает генерировать разнообразные eventout’ы! Т.е. по умолчанию TimeSensor НЕ ПРИХОДИТСЯ АКТИВИРОВАТЬ, и этим он принципиально отличается от остальных узлов-сенсоров. Не забудьте, что кроме поля enabled, есть поля starttime и stoptime, которые имеют больший приоритет, чем enabled. Но об этом — чуть позднее. А пока разберемся с остальными полями. Цикл работы TimeSensor’а может быть либо один (loop FALSE) либо при loop TRUE циклов будет много, (бесконечно, если stoptime меньше, чемstarttime, иначе пока не наступит stoptime). Длительность цикла задается полем cycleinterval. Что же происходит хронологически? Если starttime=0, то как только TimeSensor активирован (при enabled TRUE — сразу после загрузки, а при enabled FALSE — после получения сообщенияtimesensor.enabled), генерируются следующие eventout’ы: eventout isactive Посылается значение TRUE до тех пор, пока TimeSensor не будет деактивирован eventout cycletime Посылается в момент наступления starttime и в начале каждого последующего цикла при loop TRUE. eventout time Посылает абсолютное значение времени, прошедшего с начала цикла. eventout fraction_changed В отличие от eventout time посылает ОТНОСИТЕЛЬНОЕ значение степени завершенности цикла: в начале цикла fraction_changed=0, в конце цикла fraction_changed=1. Это один из наиболее часто используемых eventout’ов. При loop TRUE почти всегда используется волшебная связка.fraction_changed -.set_fraction -.value_changed,

27 где.fraction_changed — это часть от TimeSensor,.set_fraction — часть от интерполятора,.value_changed — часть от узла, у которого изменяются свойства. Теперь поговорим о starttime и stoptime. Как известно, в сетевых технологиях счет времени ведется с 00:00:00 1 января 1970 года, и значения полей starttime и stoptime в том числе. Но поскольку эти значения надо указать в секундах (т.е. сколько прошло с 00:00:00 1 января 1970 года), то чтобы пользоваться этими замечательными средствами управленияtimesensor’а не обойтись без маленького скрипта. Просмотр. Пришлось перевести миллисекунды в секунды (поделить на 1000), ВЫВОД: никогда не связывайтесь с вычислением в явном виде абсолютных значений при измерении времени (time, starttime, stoptime)! А если Вам нужно запустить анимацию в определенное время, пользуйтесь средствами, работающими с относительными значениями (cycleinterval). И тут есть два противоположных случая: первый — если после запуска в определенное время далее анимация циклично повторяется (loop TRUE), второй — если после запуска в определенное время анимация должна совершиться ОДИН РАЗ. 1. Первая задача решается очень легко. Посмотрите пример и поймете сами: Просмотр. Шарик начнет двигаться через 4 секунды после открытия файла и будет двигаться бесконечно! 2. Вторая задача несколько сложнее, поскольку нам необходимо получить сигнал set_starttime. Кто разберется в примере, надеюсь оценит идею. Просмотр. Шарик начинает двигаться через 4 секунды и движется 5 секунд. TouchSensor TouchSensor < enabled TRUE eventout hitnormal_changed eventout hitpoint_changed eventout hittexcoord_changed eventout isactive eventout isover eventout touchtime

28 Хороший сенсор, обычно используемый для большей интерактивности: чтобы что-нибудь открылось/закрылось/заработало и т.д. приходится навести курсор или щелкнуть на чем-нибудь мышкой. Поле у узла всего одно enabled TRUE/FALSE, а сам сенсор привязывается ко всем объектам, объединенным с TouchSensor’ом в одну parent группу. Работа сенсора начинается с момента наведения курсора мыши (или другого манипулятора) на объект, к которому привязан TouchSensor. При этом начинает генерироваться eventout isover TRUE. А кроме того при перемещении курсора над поверхностью объекта генерируются eventout hitnormal_changed(отслеживается положение вектора нормали к поверхности объекта), eventout hitpoint_changed (отслеживаются координаты точки на поверхности объекта, над которой находится курсор), eventout hittexcoord_changed (отслеживается положение точки на поверхности объекта, над которой находится курсор в координатах texture map). Оставшиейся два eventout’a eventout isactive и eventout touchtime генерируются при участии кнопки мыши: isactive TRUE генерируется только до тех пор пока Вы держите кнопку мыши НАЖАТОЙ (а после отпускания isactive FALSE), а eventout touchtime наоборот генерируется КАК ТОЛЬКО Вы ОТПУСКАЕТЕ кнопку мыши. Наиболее употребительными мне представляются isover, isactive и touchtime Просмотр. VisibilitySensor VisibilitySensor < center enabled TRUE size eventout entertime eventout exittime eventout isactive Этот сенсор определяет, находится ли в поле зрения область пространства внутри параллелепипеда с центром в center и размером size. Как только область становится видимой, генерируется eventout entertime и isactive становится TRUE. Как только Вы "отвернулись" и не

32 каждый cycleinterval интерполятор пробегает все значения полей key и keyvalue. Все узлы-интерполяторы (ColorInterpolator, CoordinateInterpolator, NormalInterpolator, OrientationInterpolator, PositionInterpolato, ScalarInterpolator) записываются одинаково: eventin set_fraction key [набор контрольных точек] keyvalue [набор значений, соотвествующий точкам в поле key] eventout value_changed Отличия заключаются только в ТИПЕ значения, отсылаемого через eventout value_changed. Если число значений в поле keyvalue не соответствует количеству контрольных точек в поле key, результат не определен. Важно помнить, что значения keyvalue в ПРОМЕЖУТОЧНЫХ точках между указанными контрольными точками интерполируется ЛИНЕЙНО! Т.е. если Вы, скажем, хотите организовать поступательное движение объекта по дуге, нужно быть внимательным, вводя большое количество точек в поле key (и соответственно в полеkeyvalue), поскольку движение будет аппроксимироваться ломаной. ColorInterpolator

34 eventout value_changed Нетрудно догадаться, что OrientationInterpolator позволяет организовать вращение. Только не забывайте, что значения ПРОМЕЖУТОЧНЫЕ междуkeyvalues вычисляются из ЛИНЕЙНОЙ интерполяции. Просмотр.

По следам газонокосильщика

Редакция LAN осваивает язык VRML в поисках ответа на вопрос: насколько создание виртуальных миров доступно неподготовленному пользователю? C ЧЕГО НАЧАТЬ? VRML 2.0: УЗЛЫ И ВСЕ-ТАКИ ОН ВЕРТИТСЯ! ЧТО ОСТАЛОСЬ ЗА КАДРОМ ЗАКЛЮЧЕНИЕ УЗЕЛОК ЗАВЯЖЕТСЯ.

Редакция LAN осваивает язык VRML в поисках ответа на вопрос: насколько создание виртуальных миров доступно неподготовленному пользователю?

ЧТО МЫ ВИДИМ В ВИРТУАЛЬНЫХ МИРАХ
Геометрические тела в VRML

Технология создания виртуальных миров в Internet успешно развивается и совершенствуется, но как-то полуподпольно по сравнению с тем же Java. Если воспользоваться терминологией из мира музыки, то язык VRML имеет культовый статус, т.е. имеет устойчивую армию приверженцев, не имеющую ярко выраженной тенденции к изменению численности как в меньшую, так и в большую сторону. Вероятных причин можно назвать несколько, например повышенные требования к производительности компьютеров, на которых работает интерпретатор VRML. Но единственным, по-настоящему фатальным препятствием на пути распространения этой технологии может стать только невозможность ее освоения «с ходу». Сделать более-менее сносную страницу Web способен любой, кто знаком с текстовым редактором и готов потратить часок на изучение основ HTML, создать же что-либо привлекательное в виртуальном пространстве, очевидно, не так просто. Автор решил на себе испытать, насколько же сложно стать одним из Творцов виртуальных миров, где газонокосильщики охотятся на стаи непуганых газонокосилок, и влез в шкуру неискушенного пользователя (впрочем, до написания статьи сколь-либо искушенным в VRML он и не был), написав по итогам своего исследования некоторое подобие путеводителя по миру VRML.

Илон Маск рекомендует:  8 1 4 2 выбор формата вывода файла опции вывода

C ЧЕГО НАЧАТЬ?

Поскольку автор, по роду своей деятельности, человек относительно информированный, он знал, что язык описания виртуальной реальности — VRML (Virtual Reality Markup Language) — разработан на основе более сложного и, в общем-то, не предназначенного для использования в Internet языка OpenInventor компании Silicon Graphics, являющейся, конечно же, одним из основных участников форума VRML и часто выступающей от его имени. Поэтому первым шагом автора в поисках информации о языке вместо напрашивающегося обращения к поисковому серверу был визит на узел компании, с которого по соответствующей ссылке он отправился на посвященный VRML сервер http://vrml.sgi.com . По этому адресу можно найти практически всю (по крайней мере на начальном этапе освоения языка) необходимую информацию о VRML. Давайте посмотрим, какие начальные сведения об интересующей технологии новичок получит.

Очевидно, первое, что придется узнать, — это ответ на вопрос, что же такое VRML. Казалось бы, и так все знают — это «то же самое, что HTML, только для описания трехмерных объектов». На самом деле ничего общего с HTML, кроме расшифровки двух последних букв названия и того, что описание объектов производится при помощи ASCII-текста, у VRML нет. HTML, грубо говоря, — некий набор «крючков» (вроде текстового формата RTF) для форматирования текста, и его область применения довольно жестко ограничена технологиями Web. В отличие от него, VRML относится, скорее, к объектно-ориентированным языкам программирования, и, говоря о нем, более уместным будет проводить параллели с Java. Как и Java, VRML платформенно-независим, и область его применения точно так же не ограничивается технологиями Internet/Intranet (для которых он изначально разрабатывался). Загонять объединяющий все платформы универсальный язык описания трехмерных объектов в тесные рамки домашних страниц было бы просто расточительством, поэтому рискну предположить, что VRML суждено стать промышленным стандартом.

Возможно, кто-то уже приуныл — опять язык программирования. пока его выучишь, пока напишешь что-нибудь прилично. это же вечность пройдет! Да, описывать трехмерные объекты вручную — занятие неблагодарное, требующее большого объема рутинной работы: автор еще не забыл, как сам возился с курсовой работой по машинной графике. Для облегчения проектирования виртуальных миров создано и создается множество VRML-конструкторов, позволяющих работать в режиме WYSIWYG и часто предоставляющих пользователю набор готовых к использованию объектов: несложные трехмерные тела, символы, различные предметы. Если поставляемых вместе с редактором объектов не хватает, то можно поискать в довольно обширных, с открытым доступом через Internet библиотеках. И наконец, специальные программы конвертируют в VRML описания трехмерных объектов из форматов таких приложений, как, например, 3D Studio, при помощи которых уже создано столько всего. Доступ к этим ресурсам можно получить через все тот же сервер Silicon Graphics, а также через популярные серверы свободно распространяемого ПО: www.download.com , www.slaughterhouse.com и другие.

Обилие инструментария тем не менее не освобождает от изучения языка, поскольку «доводить до блеска» созданные миры придется, скорее всего, вручную. Во-первых, работая с «мышкой», достичь высокой точности сложно, а во-вторых, принятый недавно стандарт VRML 2.0 позволяет описывать сложное поведение объектов, что требует хотя бы минимального применения традиционного программирования.

VRML 2.0: УЗЛЫ

Стандарт VRML версии 2.0 (ISO/IEC CD 14772) был принят 4 августа 1996 года. Полную спецификацию языка можно найти на сервере Silicon Graphics, но научиться использовать VMRL по ней более чем затруднительно, что, впрочем, справедливо для любых спецификаций любых языков программирования. Учебная литература по VRML, по-видимому, еще не скоро появится в наших книжных магазинах, но, по счастью, для сообщества Internet характерно стремление обладающих каким-либо сокровенным знанием поделиться им с окружающими. Все та же страница Silicon Graphics предлагает на выбор воспользоваться несколькими такими пособиями, излагающими концепции языка в последовательной и доступной форме. Конечно, в них излагается лишь малая толика возможностей VRML, но, по мере их освоения, извлечь недостающую информацию из спецификации языка становится все легче. Итак, наш новичок имеет под рукой необходимый минимум информации и горит желанием получить первый практический результат. Традиционно первой программой на любом языке является код для вывода на экран текста: «Hello, world!». В нашем случае, это будет код, описывающий самый тривиальный объект — куб (см. Рисунок 1.).

Рисунок 1.
Даже простейший пример языка VRML демонстрирует сложную объектную структуру.

Если вы хотите воспроизвести это и последующие изображения на своем ПК (набив приведенный текст вручную или воспользовавшись электронной версией нашего журнала), то для просмотра файлов VRML 2.0 потребуется соответствующий модуль расширения для вашего браузера. Найти необходимый модуль расширения можно там же, где и конструкторы VRML. Сам автор воспользовался программой Cosmo Player, разработанной Silicon Graphics. Как видим, описывается он не двумя-тремя словами, как можно было бы ожидать. Причина — строгий порядок описания объектов, которые в VRML называются узлами (nodes). Такое название выбрано далеко не случайно, поскольку объекты в языке объединяются в древовидную структуру. Каждый узел является родительским по отношению к нижележащим, а они соответственно дочерними по отношению к нему. Эта концепция именуется «instancing», что по-русски можно перевести как «организация иерархической структуры». Поскольку перевод получается довольно длинный, придется, рискуя навлечь на себя гнев пуристов, так и называть ее «инстансингом». Статус дочернего может иметь узел VRML любого типа, но родительским, а тем более корневым узлом может быть только объект одного из типов группирующих узлов. В нашем примере таковым стал узел Group. Объявив его, мы логически объединяем все входящие в него дочерние объекты, которые могут как иметь геометрическое представление, так и нет. В данном случае мы хотим создать группу из одного геометрического объекта. Подобные объекты создаются при помощи узла Shape, который имеет поля geometry и appearance, указывающие на узлы соответствующих типов. В примере поле geometry мы определили как box — параллелепипед, по умолчанию куб, но внутри фигурных скобок мы могли бы задать любую длину граней. В поле appearance мы задали цвет куба и то, как его поверхность отражает цвет. Таким образом, даже самый простой объект представляет собой ветвистое дерево узлов.

По умолчанию интерпретатор VRML поместит наш кубик в начало системы координат виртуального мира, сориентировав по ее осям оси локальной системы координат (ось X вправо по экрану, ось Y — вверх, ось Z — перпендикулярно плоскости экрана, наружу). Следующий, неизбежно возникающий вопрос — как ориентировать и располагать в пространстве создаваемые объекты. Решается он при помощи группирующего узла типа Transformer. От Group он отличается наличием нескольких новых полей вида exposedField: center, rotation, scale, scaleOrientation и translation. Center определяет сдвиг центра вращения тела (или группы тел) относительно начала локальной системы координат. Translation тоже определяет сдвиг, но уже начала локальной СК относительно CK родителя. Rotation определяет поворот локальной системы координат только относительно одной из осей, если же необходимая ориентация объекта требует сложного поворота, то следует добавить два внешних или внутренних трансформера. Scale и scaleOrientation позволяют растянуть или сжать объект, задавая коэффициент преобразования и ориентацию осей, вдоль которых оно происходит, относительно локальной системы координат. Таким образом, чтобы, например, поставить наш кубик на ребро, надо

Цифры 1 0 0 после слова rotation задают ось, вокруг которой производится поворот, в данном случае это орт оси X (0 1 0 соответствует Y, 0 0 1 — Z), а 0,785 — это PI/4 или 45 градусов. По замыслам автора, куб должен был быть сориентирован так, чтобы его главная диагональ располагалась параллельно оси Y абсолютной системы координат (скоро будет ясно зачем), для чего требовалось совершить второй поворот вокруг оси абсолютной системы координат на легко вычисляемый угол. Тут-то и начались первые серьезные трудности, поскольку из-за использования полем rotation локальной системы координат пришлось полученный угол поворота пересчитывать в углы поворотов вокруг двух ее осей. Из недр книжного шкафа извлекли книгу Ильина и Позняка «Аналитическая геометрия», и полдня было потрачено на реанимацию знаний о преобразовании систем координат, углах Эйлера, и прочем подобном, казалось бы, навсегда оставленном за порогом института. Впрочем, никаких зубодробительных формул в книге не содержится, и нужный при работе с трехмерной графикой минимум знаний вполне по силам освоить любому технически грамотному человеку. Необходимость этих знаний проявляется прежде всего при анимации созданных объектов.

И ВСЕ-ТАКИ ОН ВЕРТИТСЯ!

Главное отличие стандарта 2.0 от первой версии VRML — возможность задать объектам сколь угодно сложное поведение. Достигается это при помощи двух типов узлов: интерполяторов и сенсоров. Изменение параметров объектов происходит при получении им соответствующего сообщения. Вне зависимости от того, от какого узла он его получает, начало цепочке событий дает какой-нибудь сенсор. Существуют следующие типы сенсоров: CylinderSensor, PlaneSensor, ProximitySensor, SphereSensor, TimeSensor, Touch-Sensor, VisibilitySensor. Большая часть этих узлов реагирует на воздействие на объект при помощи указывающего устройства, в частности мыши. TouchSensor реагирует на «прикосновение», т.е. щелчок кнопки. CylinderSensor, PlaneSensor и SphereSensor срабатывают при попытке изменения положения объекта и носят обобщающее название Drag Sensor. CylinderSensor срабатывает при попытке повернуть объект вокруг оси; направление оси фиксируется заранее. Такой сенсор применим для моделирования колеса из «Поля чудес» — колесо будет крутиться только при поперечном движении. В отличие от CylinderSensor, SphereSensor реагирует на попытку повернуть объект в любом направлении. Как уже понятно, PlaneSensor активируется при попытке линейного перемещения объекта. Узлы ProximitySensor и VisibilitySensor генерируют сообщения о том, что виртуальная камера приблизилась к объекту на заданное расстояние или объект попал в ее поле зрения. TimeSensor представляет собой часовой механизм, отсчитывающий время до генерации события. С одним узлом может быть ассоциировано несколько сенсоров, сообщения которых обрабатываются по очереди, поэтому создателю трехмерных миров необходимо отслеживать возможность возникновения противоречивых ситуаций.

Однако не эти, вызывающие аналогии со взрывными механизмами, узлы непосредственно заставляют объект ожить. В роли детонаторов или, если отвлечься от нездоровой подрывной темы, кукловодов выступают интерполяторы. Такое название для этого класса узлов выбрано потому, что автор задает любое движение или изменение внешнего вида объекта в виде нескольких промежуточных стадий, а из дискретного плавным преобразование объекта становится при помощи интерполяции дополнительных промежуточных положений. Или автор может задать некоторое преобразование для отдельных участков объекта, а интерполятор проведет адекватное преобразование для объекта в целом. Как же можно измываться над бедным объектом? Так, что его родная мать не узнает! При помощи узла Position-Interpolator его можно переместить, а OrientatonInterpolator его повернет, но это еще цветочки. При помощи ScalarInterpolator можно как угодно увеличить или уменьшить любой его выражаемый численно параметр: радиус, длину ребра — все, что хотите. Объект можно перекрасить, как угнанную машину, при помощи ColorInterpolator. Если это многогранник, то CoordinateInterpolator перекособочит его до неузнаваемости, а если объект сферического происхождения, то NormalInterpolator превратит его хоть в мяч для регби, хоть в куриное яйцо. Как видим, возможности предоставляются самые широкие, но, чтобы ими воспользоваться, надо организовать передачу сообщений между объектами. Делается это при помощи директивы ROUTE — в конце файла помещаются строки следующего вида:

имена объектов должны быть заданы при помощи директивы DEF.

Пример простейшей анимации приведен на Рисунок 2 (текст программы приведен на Распечатке 1).

Рисунок 2.
Обратите внимание, что, хотя концепция объектно-ориентированного программирования реализована в VRML в ограниченном варианте, порой она доведена до абсолюта. Узлы типа Transformer и TimeSensor в нашем примере функционально и логически являются операторами, но описываются они как объекты!

Теперь понятно, зачем автор ломал голову над углами и осями — вращение куба вокруг главной диагонали выглядит намного эффектней, чем вращение вокруг оси симметрии. Разберемся подробней в устройстве механизма вращения, начав с его «моторчика» — интерполятора. У узла Rotation-Interpolator, как и у других интерполяторов, есть два поля: key и keyValue, представляющих собой индекс массива возможных значений изменяемого (интерполируемого) параметра и собственно массив. В данном случае этот параметр — значение поля rotation для Transformer, поэтому он задается в виде ортов вращения и угла поворота; в приведенном случае поворот происходит вокруг оси Y. Использование интерполяции позволяет задать всего три положения объекта — начальное, конечное и промежуточное. Этого вполне достаточно, чтобы задать полный оборот вокруг своей оси и его направление. Добиться непрерывного вращения нам дает возможность TimeSensor, который будет циклически запускать интерполятор. (В принципе, параметры таймера и интерполятора можно варьировать так, чтобы объект поворачивался на любой заданный угол с требуемой скоростью, не обязательно циклически.) Проводками, связывающими все три узла игрушки, являются две директивы ROUTE. Первая посылает интерполятору импульс таймера, предписывающий сменить текущее значение key. Вторая передает от интерполятора трансформеру директиву сменить значение поля rotation на соответствующее keyValue.

В принципе, этот пример позволяет получить достаточно ясное представление о языке; единственнное, чего он не объясняет, — как привязать к объекту ссылку на какой-нибудь URL. Для этого надо поместить объект внутрь узла типа Anchor:

Собственно, так я и поступил в своем третьем примере (Рисунок 3), текст которого я не привожу из-за его размера. Щелкнув мышкой на вращающееся лого нашего издательского дома, вы попадете на сервер: www.osp.ru (конический постамент находится вне узла Anchor).

Рисунок 3.
Когда-нибудь мы вынесем это на первую страницу сервера. Вполне законченное (и осмысленное) произведение VRML. Объем файла — всего около 2,8 Кбайт.

ЧТО ОСТАЛОСЬ ЗА КАДРОМ

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

Звук. Картину можно озвучить при помощи узла AddSound, позволяющего ассоциировать с объектами аудиоклипы. Продвинутые браузеры используют стереоэффекты и изменяют громкость звучания в зависимости от того, как объект и виртуальная камера расположены по отношению друг к другу.

Свет. Несколько узлов позволяют задавать тип освещения в виртуальном мире, располагая в нем источники света — направленного или рассеянного, точечные или фронтальные. Интенсивность, степень рассеяния и цвет исходящего от них света можно варьировать. При желании в созданный мир можно напустить тумана, затеняющего удаленные объекты и рассеивающегося по мере приближения к ним.

Выполнение сценариев. Интерполяторы и сенсоры предоставляют широкие возможности по анимации объектов, но сделать поведение более сложным, чем у заводных игрушек, можно только при помощи сценариев, производящих сложные вычисления и интеллектуальную обработку событий. VRML позволяет применять Java/JavaScript и свой собственный язык VRMLScript. Интерфейс взаимодействия со сценариями VRML 2.0 также динамически меняет структуру маршрутизации сообщений.

ЗАКЛЮЧЕНИЕ

На поиск информации и освоение общих концепций языка автор потратил около недели, занимаясь попутно другими делами. Этот факт говорит о том, что упоминаемое в начале статьи фатальное препятствие на пути распространения VRML не стоит, и ему несомненно предстоит перерасти культовый статус. Кстати, я вовсе не намерен забросить VRML после написания статьи. Поскольку я намерен в ближайшем будущем обзавестись собственной страницей в Internet, то предполагаю продолжить изучение VRML, с целью применить его на практике. Со сложностями вычислительно-геометрического плана я как-нибудь справлюсь, а язык вполне поддается изучению между делом. Надеюсь, что, прочитав статью, вы тоже попробуете себя в создании виртуальных миров.

УЗЕЛОК ЗАВЯЖЕТСЯ.


Объектно-ориентированное программирование в VRML

Объект в языке VRML называется узлом (node); определяют узел следующие характеристики.

  • Тип узла: Group, Shape, Box и т. д.
  • Поля. Узел может иметь любое количество полей, содержащих параметры, отличающие его от других узлов того же типа. Каждое поле имеет имя, тип и значение по умолчанию. Поля содержат в себе данные различных типов, в том числе и ссылки на другие узлы. Поля бывают двух видов: field и exposedField. Первые не могут изменять своего значения, заданного при инициализации объекта, вторые могут быть изменены как «изнутри», так и другими узлами. В какой-то степени это некоторый аналог понятиям C++ private и public.
  • Набор ассоциированых сообщений (событий), которые узел может принимать и отправлять. Узел получает сообщения типа eventIn, которые обычно влекут за собой изменения состояния узла и обозначаются set_хххх (set_color, set_position). Отправляемые узлом сообщения обычно содержат информацию об изменении его состояния (color_changed, position_changed) и имеют тип eventOut. Объявление в узле поля типа exposedField равноценно ассоциированию с объектом двух событий. Т.е., строчка

Инициализируется объект строчкой:

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

ЧТО МЫ ВИДИМ В ВИРТУАЛЬНЫХ МИРАХ


Геометрические тела в VRML

Поле geometry узла Shape помимо Box может принимать целый ряд значений. Во-первых, это Cone, Sphere и Cylinder — конус, сферу и цилиндр, соответственно. Во-вторых, Extrusion — объект, являющийся произвольным телом вращения, и IndexedFaceSet — произвольный многогранник, буквально — набор многоугольников. В-третьих, объекты, так сказать, низкого уровня: прямоугольная решетка ElevationGrid, IndexedLineSet — 3-мерная структура из ломаных линий, и PointSet — набор точек в 3-мерном пространстве. Завершает список стоящий особняком узел типа Text, поскольку он описывает текст, написанный на воображаемой плоскости, и не является полноценным трехмерным объектом, так как сам двумерен (хотя плоскость можно сориентировать как угодно).

Подробно описывать узел типа Appearance вряд ли стоит, поскольку он ссылается на богатые различными параметрами узлы трех типов. Мы ограничимся обобщенным описанием вариаций внешнего вида геометрических тел. Поверхность заданного в поле geometry объекта можно украсить текстурой: растровым изображением (GIF, JPEG, PNG), видеоклипом (MPEG-1) или логическим набором пикселов. При желании текстуру можно растянуть/сжать или повернуть относительно поверхности тела. Поля узла Material позволяют задать цвет поверхности тела и ее способность поглощать, отражать и пропускать свет, что даст возможность имитировать различные эффекты — от матовой шероховатости бетона до бликов на стекле или боку яблока.

РАСПЕЧАТКА 1

Поделитесь материалом с коллегами и друзьями

Understanding Interpolators in Android

In the journey of learning animations in Android, all of us wonder what interpolators are and how do we use them.

While observing �� the difference in animation behaviour due to the interpolators, I simultaneously read their code implementation to get an idea about how an interpolator defines the rate of change of an animation.

String is a sequence of characters. In the same manner, Animation is a sequence of still images (also known as frames) moving in a time interval.

With each instance of time, there is a one to one mapping of a frame. These frames are little different from each other, moving in series creating animation effect (like translate, scale, rotate, alpha).

An Interpolator comes into the picture between animation time interval to help change the mapping of a frame to time instance.

It replaces the frame for a particular time instance with another frame. The replacement frame can be from past, present or future time instance depending upon the type of interpolator used for animation.

An interpolator is a mathematical tool that takes original time instances as an input, performs operation based on its mathematical equation and provides output as a time instance of a replacement frame for that given input instance.

For simplicity, let’s take an example of Linear Interpolator.

It’s mathematical equation is:

The graph clearly shows that with no change in input, output remains unchanged and animations remain unaffected ↔️.

But what if we modify the linear equation and create our own custom linear Interpolator by adding some fractional constant to given input to see changes in animation.

It’s mathematical equation will be like:

Now it starts animating ahead of original state and finishes ahead of the final state �� because the interpolator function produces time instance frames.

Let’s take another interpolator, a bit complex mathematical equation say Accelerate Interpolator.

It makes the rate of change of frames from slow �� to fast �� with the certain acceleration.

It’s mathematical equation is:

From the plot, we can observe that each adjacent point difference increases �� with time. Therefore, it shows acceleration type of behavior.

Now we are ready to make own custom interpolator as desired ��. I have tried simulating the Spring effect using interpolator ツ

It’s mathematical equation is:

I hope you have learned something new by reading this article��.

I have also created a playground �� of interpolators. Which showcases how different animations are affected by different interpolators. It also includes graphs and equations to each interpolator �� and will help understanding other interpolators like Anticipate, Overshoot, Bounce, Cycle.

In case you want to check out the code, here is Github repo link.

KIA Avella Полумазда › Logbook › Экспресс проверка работоспособности датчика давления в коллекторе (MAP sensor). Теперь на видео.

Всем коничива и нихао!
Не хотелось про политику, но с апреля вводят новые акцизы на бензин и все аналитики прогнозируют возможный рост цен на бензин. На 2-2,5 рубля за литр. Да и не только на него, на все в итоге, цена бензина лежит во всех товарах…
Что в таком случае надо делать мужикам? Правильно, вооружившись знаниями начать проверять все системы любимой машинки, чтобы кушала меньше, а ездила больше!
Вот и я озаботился и провел проверку, а что там у нас с датчиком ДАД, он же MAP sensor, он же датчик абсолютного давления в впускном коллекторе. Есть мнение, что он деградирует и начинает врать, его надо тогда менять. Целью проверки и было зафиксировать крайние точки для анализа его характеристик. Заодно удалось воспроизвести характерную для Авелки неисправность, при которой на холостом ритмично падают и подскакивают обороты от 200…300 до 1500…2000, воняет бензином из глушака и машина едет как хочет.

Для начала видео. Как всегда напоминаю, что влезая в системы машины вы действуете на свой страх и риск! Всегда убеждайтесь, что нет кз в соединениях. Подключаемся к среднему контакту, введя вдоль провода до упора в контакт булавку и подвесив к ней щуп. Минус я брал с аккумулятора.

Если точно замерить разряжение на холостых и соответствующее ему напряжение на выходе, а потом эти же значения при атмосферном давлении и построить по этим двум точкам график, то наложив его на заводской, построенный по таблице разряжение/напряжение в ТУ на датчик можно увидеть, в допуске ли он.

Так почему начинается раскачка оборотов когда в вакуумном шланге датчика дырка или какая неплотность в коллекторе? Далее все имхо. Датчик думает, что заслонка открылась и давление упало, вакуума то нет. ЭБУ послушно льет бензин, сначала повышая обороты, а потом кислород в коллекторе кончается, заслонка то закрыта, а через дырку не поступает в нужных объемах. И двигатель останавливается. А когда мотор проседает, ЭБУ понимает, что надо что то делать и открывает клапан хх, поступает порция кислорода, обороты растут, двигатель разгоняется и выжигает его, обороты падают и так по новой. Достаточно открыть дроссель и раскачка проходит. Именно это я сделал сразу после запуска — вкрутил упорный винт дз и мотор стал тарахтеть хоть и на повышенных оборотах, но ровно. А потом провел ревизию всех трубок, чистку дросселя с клапаном хх и устранив все неплотности смог выставить нормальные холостые обороты.

ПС Загляните в мой драйвовский блог. Там сейчас выкладываются кое-какие материалы по машине.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL