Сегодня мы продолжим знакомится с языком VRML. В прошлый раз я рассказал тебе о примитивах. Мы научились их создавать и отображать в окне браузера. Сегодня нам предстоит научится изменять их свойства, такие как цвет, материал и текстура. Возможно, что я расскажу ещё что-нибудь. Посмотрим как всё будет получаться.
Для указания цвета и материала примитива используется одна и та же функция - material.
Если ты читал мои статьи про OpenGL или просто уже знаешь этот язык программирования, то наверно заметил сходство в названиях свойств материала. Это действительно одни и те же свойства. Четыре свойства материала diffusecolor, emissivecolor, ambientcolor, specularcolor задаются значением цвета в формате RGB.
transparency - задаёт степень прозрачности и может быть в пределах от 0 до 1. Если ты поставишь 1, то объект будет абсолютно прозрачен.
Для натягивания на объект текстуры используется команда Texture2. Она загружает графические данные из файла и использует их в качестве обоев для примитива. В качестве графического файла я бы посоветовал использовать gif, потому что его поддерживают большинство просмотрщиков VRML. Вот как выглядит команда:
Здесь опять же просматривается аналогия с 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. Здесь нет ничего удивительного, потому что этот язык очень простой и имеет не так уж и много операторов. Хотя во второй версии добавлено достаточно много нового и возможно, что мы немного позже познакомимся с этими нововведениями.