Шаг 5 - Типы полей и событий

Мы уже говорили, что поля в узлах предназначены для того, чтобы создавать различные реализации объектов. Так как в полях может содержаться различная по типу информация, в VRML существует несколько типов полей. Все поля и события делятся на два основных класса:

  1. Поля и события содержащие одно значение. Имеют префикс SF в названии от Single-valued Fields.
  2. Поля и события содержащие множество значений. Имеют префикс MF от Multiple-valued Fields.

Поля содержащие несколько значений записываются в виде последовательного списка значений (разделенных пробелами или запятыми) заключенного в квадратные скобки. Практически такие поля можно назвать массивами. Если список значений пуст, то используются пустые внутри скобки "[ ]". Если список содержит одно значение, то оно может указываться без скобок. Несколько примеров записи значения 0 и (1,2,3) в многозначное поле mf_example:

mf_example 0
mf_example [0,]
mf_example [ 0 ]
mf_example [ 1 2 3 ]
mf_example [1, 2, 3]
mf_example [1 2, 3]

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

Тип SFBool

Тип SFBool используется для хранения булевых значений. Значения "истина" и "ложь" задаются с помощью зарезервированных слов TRUE и FALSE. Булевые события eventOut при инициализации получают значение FALSE. Надо также сказать, что данный тип единственный из всех примитивных типов VRML не имеет мультизначного аналога. С чем это связано сложно сказать, возможно массивы булевых значений не имеют смысла.

Типы SFColor и MFColor

Данные типы полей и событий используются для задания цветов. Тип SFColor определяет один RGB цвет в виде трех значений составляющих, каждое значение лежит в диапазоне [0.0 ... 1.0]:

# красный
sf_color_example 1 0 0
# синий
sf_color_example 0 0 1

Тип MFColor определяет массив из цветов SFColor. К примеру массив из 3 цветов записывается так:

mf_color_example [ 1 0.0 0, 0 1.0 0, 1.0 0. 0.0]

Начальное значение события SFColor eventOut равно 0 0 0, а значение события MFColor eventOut равно [ ] (пустой массив).

Типы SFFloat и MFFloat

Поля данных типов содержат вещественные чила, которые задаются по всем стандартам языка C. Пример:

#SFFloat
abcd 6.1241
#MFFloat
mf_value [ 3.14159, 42.1e-2, .0012 ]
sec_exam [ .015 12.23 23.56e+02 6.4e-05 ]

Начальные значения события eventOut для SF... и MF... равны 0.0 и [ ] соответственно.

Тип SFImage

Более сложный тип поля. Он определяет несжатое плоское изображение, которое может использоваться, например, в качестве текстуры. Задается в виде:

	SFImage image_field <ширина> <высота> <кол-во_компонент> <значения_пикселов>

Первые два значения поля определяют размеры изображения. По данными значениям вычисляется количество пикселов в изображении, как <ширина> x <высота>. Именно такое количество целых чисел должно быть в списке значений пикселов.

Значение <кол-во_компонент> определяет битовое разрешение изображения. Значения цветов пиксела ограничены 256 значениями интенсивности, т.е. 0-255 в десятичной и 0x00-0xFF в шестнадцатеричной форме.

Если количество компонент задано как 1, то каждое значение пиксела определяет его интенсивность. Это значит можно задать серое (grayscale) изображение. При этом 0x00 задает черный цвет, а 0xFF белый цвет.

Двух-компонентные изображения имеют значения пикселов от 0x0000 до 0xFFFF. При этом первый байт задает интенсивность пиксела, второй байт задает прозрачность пиксела. Получается серое изображение с альфа-каналом, которое может быть полезно при создании прозрачных материалов (например, стекла).

Трех-компонентные изображения уже являются цветными и каждый байт задает соответственно интенсивность одного из составляющих цвета RGB. Таким образом 0xFF0000 - красный цвет, 0x00FF00 - зеленый, 0x0000FF - синий.

Четырех-компонентные изображения - это цветные изображения с альфа-каналом. Значение последнего байта определяет прозрачность, при этом 0x00 - полностью прозрачный пиксел, 0xFF - непрозрачный. Например, значение 0xFF00007F задает полупрозрачный красный цвет.

Помните, что при пикселы задаются слева направо и снизу вверх. Посмотрим на примере:

# изображение 2x2
image_example 2 2 3 0xFF00   0xFF0000    255    0x0000FF
#                   зеленый   красный   белый    синий

В этом случае изображение будет таким:

5.gif (62 b)

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

Осталось сказать о начальном значении события SFImage eventOut, оно равно (0 0 0).

Типы SFInt32 и MFInt32

Поля данных типов содержат 32-битные целые числа. Задаваться они могут в десятичном виде и шестнадцатеричном (через 0x). Например:

mfint32_example [ 21, -234 0xFF0C1D, -0xB23 1 0x00]

Начальные значения события eventOut равны 0 и [ ].

Типы SFNode и MFNode

Тип SFNode задает узел VRML. Соответственно MFNode задает массив узлов. Для примера массив из пяти узлов, пока без пояснения их действий:

mfnode_1 [
	Transform { translation 1 1 0 }
	DEF SPHERE Sphere { }
	USE SPHERE
	USE ANY_OTHER_NODE
]

Для указания пустоты события SFNode eventOut используется ключевое слово NULL. Для MFNode по прежнему используется [ ].

Типы SFRotation и MFRotation

Данные типы определяют поворот вокруг заданного вектора нормали. Записывается в виде:

sf_rotation  <X> <Y> <Z> <угол>

Первые три параметра - это вещественные числа задающие вектор нормали, относительно которого будет происходить вращение. Поле <угол> задает угол поворота в радианах, поворот происходит по часовой стрелке. Пример для вращения на 180 градусов вокруг оси Y:

a_rot 0.0 1.0 0.0 3.141592

Начальное значение SFRotation eventOut равно (0 0 1 0), а MFRotation равно [ ].

Типы SFString и MFString

Данные типы полей содержат строки в кодировке utf8. Тип SFString сожержит одну строку, MFString содержит массив строк. Строкой в VRML считается последовательность символов заключенная в двойные кавычки, т.е. "строка". В строку могут входить любые символы, включая переносы строк и символы комментария "#". Двойные кавычки в строке записываются через обратный слеш (как в C). Пример:

# MFString
str_array [ "simple string", "i said \"Hello!\"","backslash - \\" ]

Начальное значение события SFString eventOut равно "", т.е. пустой строке. Для MFString eventOut начальное значение равно [ ].

Типы SFTime и MFTime

Параметр типа SFTime позволяет хранить одно значение времени. Тип MFTime - хранит массив значений времени. Значение времени в VRML записывается в виде вещественного числа двойной точности в формате C. Временные значения задаются в количестве секунд начиная с полуночи 1 января 1970 по гринвичу (Jan 1, 1970, 00:00:00 GMT).

Начальное значение события SFTime eventOut равно -1, для MFTime соответственно [ ].

Типы SFVec2f/SFVec3f и MFVec2f/MFVec3f

Данные типы задают одиночные значения и массивы векторов. Для двумерных векторов используется ...Vec2f, для трехмерных ...Vec3f. Координаты у векторов записываются в виде вещественных чисел разделенных пробелами.

# MFVec2f
vec2d_array  [10 2, 12 10, 5.43 0.124]

# MFVec3f
vec3d_array  [5.12 1.4 -12, 12e+2 101 23.1, 3.13 2.4 23.2e-05]

Начальные значения события eventOut равны (0 0) и (0 0 0), для массивов векторов [ ].


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей.