Мы уже говорили, что поля в узлах предназначены для того, чтобы создавать различные реализации объектов. Так как в полях может содержаться различная по типу информация, в VRML существует несколько типов полей. Все поля и события делятся на два основных класса:
Поля содержащие несколько значений записываются в виде последовательного списка значений (разделенных пробелами или запятыми) заключенного в квадратные скобки. Практически такие поля можно назвать массивами. Если список значений пуст, то используются пустые внутри скобки "[ ]". Если список содержит одно значение, то оно может указываться без скобок. Несколько примеров записи значения 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 используется для хранения булевых значений. Значения "истина" и "ложь" задаются с помощью зарезервированных слов TRUE и FALSE. Булевые события eventOut при инициализации получают значение FALSE. Надо также сказать, что данный тип единственный из всех примитивных типов VRML не имеет мультизначного аналога. С чем это связано сложно сказать, возможно массивы булевых значений не имеют смысла.
Данные типы полей и событий используются для задания цветов. Тип 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 равно [ ] (пустой массив).
Поля данных типов содержат вещественные чила, которые задаются по всем стандартам языка 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 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 # зеленый красный белый синий
В этом случае изображение будет таким:
Как вы видите из примера незначащие нули слева можно не писать, как в зеленом цвете. Также можно использовать значения в десятичном виде, как в белом цвете. Говоря проще, Вы записываете одно-,двух-,трех- и четырех-байтовые целые числа в доступном и простом для вас виде, либо просто в виде десятичного числа, либо в шестнадцатеричном виде.
Осталось сказать о начальном значении события SFImage eventOut, оно равно (0 0 0).
Поля данных типов содержат 32-битные целые числа. Задаваться они могут в десятичном виде и шестнадцатеричном (через 0x). Например:
mfint32_example [ 21, -234 0xFF0C1D, -0xB23 1 0x00]
Начальные значения события eventOut равны 0 и [ ].
Тип SFNode задает узел VRML. Соответственно MFNode задает массив узлов. Для примера массив из пяти узлов, пока без пояснения их действий:
mfnode_1 [ Transform { translation 1 1 0 } DEF SPHERE Sphere { } USE SPHERE USE ANY_OTHER_NODE ]
Для указания пустоты события SFNode eventOut используется ключевое слово NULL. Для MFNode по прежнему используется [ ].
Данные типы определяют поворот вокруг заданного вектора нормали. Записывается в виде:
sf_rotation <X> <Y> <Z> <угол>
Первые три параметра - это вещественные числа задающие вектор нормали, относительно которого будет происходить вращение. Поле <угол> задает угол поворота в радианах, поворот происходит по часовой стрелке. Пример для вращения на 180 градусов вокруг оси Y:
a_rot 0.0 1.0 0.0 3.141592
Начальное значение SFRotation eventOut равно (0 0 1 0), а MFRotation равно [ ].
Данные типы полей содержат строки в кодировке utf8. Тип SFString сожержит одну строку, MFString содержит массив строк. Строкой в VRML считается последовательность символов заключенная в двойные кавычки, т.е. "строка". В строку могут входить любые символы, включая переносы строк и символы комментария "#". Двойные кавычки в строке записываются через обратный слеш (как в C). Пример:
# MFString str_array [ "simple string", "i said \"Hello!\"","backslash - \\" ]
Начальное значение события SFString eventOut равно "", т.е. пустой строке. Для MFString eventOut начальное значение равно [ ].
Параметр типа SFTime позволяет хранить одно значение времени. Тип MFTime - хранит массив значений времени. Значение времени в VRML записывается в виде вещественного числа двойной точности в формате C. Временные значения задаются в количестве секунд начиная с полуночи 1 января 1970 по гринвичу (Jan 1, 1970, 00:00:00 GMT).
Начальное значение события SFTime eventOut равно -1, для MFTime соответственно [ ].
Данные типы задают одиночные значения и массивы векторов. Для двумерных векторов используется ...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), для массивов векторов [ ].