VR
Virtual Reality On-line   VRML
Новости   |     Журнал    |    Хаkер   |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]
[ Download  ]
[  Конкурс  ]
[  Анекдоты ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
Язык VRML.
Сойства примитивов
:

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

Для указания цвета и материала примитива используется одна и та же функция - material.

material {
 diffusecolor 0 0 1
 emissivecolor 0 0 1
 ambientcolor 0 0 1
 specularcolor 0 0 1
 transparency 0
 }

Если ты читал мои статьи про OpenGL или просто уже знаешь этот язык программирования, то наверно заметил сходство в названиях свойств материала. Это действительно одни и те же свойства. Четыре свойства материала diffusecolor, emissivecolor, ambientcolor, specularcolor задаются значением цвета в формате RGB.

transparency - задаёт степень прозрачности и может быть в пределах от 0 до 1. Если ты поставишь 1, то объект будет абсолютно прозрачен.

Вот пример синего кубика-рубика

material {
 diffusecolor 0 0 1
 emissivecolor 0 0 1
 ambientcolor 0 0 1
 specularcolor 0 0 1
 transparency 0
 }
cube{
width 5
height 10
depth 8
}

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

Texture2{
  filename "filename.gif"
  image 0 0 0
  wrapS REPEAT
  wrapT REPEAT
 }

Здесь опять же просматривается аналогия с OpenGL. Всё те же wrapS и wrapT, которые могут принимать значения REPEAT или CLAP. Для тех, кто не знает OpenGL поясняю, что эти параметры управляют натягиванием текстуры на примитив по горизонтали и вертикали. REPEAT заставляет текстуру повторятся по соответствующей оси, а CLAP растягиваться по всей оси.

Параметр image указывает смещение текстуры по осям X, Y и Z.

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

Translation {
 Translation 1 7 5
}

Эта команда перемещает объект по осям X, Y и Z. В данном примере я произвожу смещение по оси Х на 1, оси Y на 7 и оси Z на 5. Начало координат (точка 0 0 0) находится в центре экрана. Когда ты начинаешь рисовать, примитивы появляются именно там. После смещения относительно текущей точки с помощью команды translation объекты начнут рисоваться в новом месте. Если ты произведёшь ещё одно смещение, то оно произойдёт относительно текущей координаты, а не относительно начала координат. Для большей ясности рассмотрим пример:

#VRML V1.0 ascii

#первая сфера в центре экрана
sphere { radius 1 } 

#сдвигаем центр координат на 1 по Х и 3 по Y.
Translation { Translation 1 3 0 }

#рисуем сферу в новом месте
sphere { radius 1 } 

#сдвигаем центр координат на 1 по Х и -3 по Y.
#относительно предыдущей оси координат
Translation { Translation 1 -3 0 }

#рисуем сферу в новом месте
sphere { radius 1 } 

Реальное положение последней сферы будет рассчитываться как расположение первой (0 0 0) + первое смещение (1 3 0) + второе смещение (1 -3 0) и всё это равно (2 0 0). Вот оно реальное положение третей сферы относительно центра координат.

В OpenGL, для уничтожения такого эффекта использовались glPushMatrix и glPopMatrox. Здесь есть подобная штучка - separator {} Рассмотрим пример

#VRML V1.0 ascii

separator{   #здесь запоминается текущие координаты
#сдвигаем центр координат на 1 по Х и 3 по Y.
Translation { Translation 1 3 0 }
#рисуем сферу в новом месте
sphere { radius 1 } 
}     #здесь восстанавливаются координаты.

#сдвигаем центр координат на 1 по Х и 3 по Y.
Translation { Translation 1 3 0 }
#рисуем сферу в новом месте
sphere { radius 1 } 

separator{   #здесь запоминается текущие координаты
#сдвигаем центр координат на 1 по Х и -3 по Y.
#относительно предыдущей оси координат
Translation { Translation 1 -3 0 }
#рисуем сферу в новом месте
sphere { radius 1 } 
}     #здесь восстанавливаются координаты.

Перед входом в первый separator сохранились текущие координаты (0 0 0). Мы сдвинули первую сферу и нарисовали её внутри separator. После выхода текущая координата вернулась в ту, что была до входа (0 0 0). Потом я сдвигаю координату в точку (1 3 0) и рисую вторую сферу. Далее идёт ещё один separator, который сохраняет текущую координату (1 3 0). Внутри сепаратора я произвожу сдвиг относительно текущей координаты (1 3 0) на (1 -3 0) и рисую ещё одну сферу в новой точке (2 0 0). После выхода из separator текущая координата возвращается в позицию (1 3 0), которая была до входа.

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

Я думаю, что на сегодня хватит. Мы и так изучили достаточно много. В следующий раз мы уже наверно закончим с изучением основ VRML 1.0. Здесь нет ничего удивительного, потому что этот язык очень простой и имеет не так уж и много операторов. Хотя во второй версии добавлено достаточно много нового и возможно, что мы немного позже познакомимся с этими нововведениями.


Copyright©: Horrific aka Флёнов Михаил
Design by FMk group©