
Тема 2
.pdf2.3 Программный продукт HyperFun
HyperFun является открытым программным продуктом, разрабатываемым в рамках одноименного проекта. Это программный продукт обладает широкими функциональными возможностями для моделирования и визуализации пространственных объектов, которые могут быть использованы в различных приложениях.
Проект HyperFun является международным. Участниками этого проекта являются ученые и студенты из различных стран (Великобритания, США, Россия, Франция, Япония, Норвегия и др.). В декабре 2009 года проект HyperFun «отметил» 10-летие своего существования.
Отметим, что в HyperFun для определения геометрических объектов служит описывающая функция этих объектов f(x,y,z). Под описывающей функцией понимается функция, используемая в неравенстве рассматриваемой фигуры: f(x,y,z)>=0 (смысл этого неравенства заключается в том, что оно истинно только для координат тех и только тех точек, которые принадлежат этой фигуре).
Рассмотрим основные характеристики функциональных процедур программного продукта HyperFun, используемого в качестве инструментального средства при написании прикладных программ визуализации. В начале, рассмотрим основные характеристики входного языка программирования этого программного продукта HyperFun – языка HyperFun, используемого для написания прикладной программы визуализации.
Программирование на языке HyperFun
Язык HyperFun является простым языком программирования, созданным специально для работы в среде HyperFun. Данный язык, как и рассмотренный выше язык maxScript, имеет простую структуру и синтаксис, он является языком интерпретируемого типа. Программа на языке HyperFun представляет собой последовательность операторов. Можно выделить следующие типы операторов:
1.арифметические операторы
2.логические операторы
3.условные операторы
4.циклические операторы
5.операторы функций
При написании прикладной программы визуализации для инициации (вызова) той или иной функциональной процедуры используется, в основном, синтаксическая конструкция в виде одного или нескольких операторов функции:
Общий вид оператора функции:
<название функции> (<параметр 1>, <параметр 2>,...,<параметр n>)
Значения параметров текущей выполняемой функциональной процедуры в прикладной программе визуализации определенным образом связываются с результатом выполнения предыдущей функциональной процедуры.
Параметры могут представлять собой:
·Числовые значения
·Символьные значения
Вся прикладная программа визуализации на HyperFun должна начинаться с синтаксической конструкции my_model(x[3], a[1], s[3]){, и заканчиваться конструкцией my_model = y ;}. Здесь x[3] – массив входных переменных описывающей функции (в обем случае, размерность может быть больше трех). a[1] – параметр описывающей функции (или массив параметров, например, a[7]). s[3] – массив атрибутов. Эти атрибуты, как правило, используются для задания цвета моделируемого пространственного объекта. y – выходная переменная этой функции.
Рассмотрим примеры использования различных функциональных процедур. Начнем с рассмотрения функциональных процедур задания исходных данных.
Функциональные процедуры задания исходных данных
При использовании языка HyperFun функциональными процедурами задания исходных данных в 3ds Max являются процедуры открытия файла, чтения данных из файла, закрытия файла. Эти процедуры являются нештатными процедурами расширения HyperFun, используемые для написания прикладных программ визуализации. Вызов функциональной процедуры осуществляется с помощью соответствующего оператора функции. В качестве таких операторов могут использоваться операторы:
openfile("r"/"w","<наименование файла>") – оператор открытия текстового файла (r – чтения из файла,w – запись в файл)
readfile(n,"<наименование файла>")) – чтение значения из файла (n – номер позиции значения)
rfile("<наименование файла>")) – чтение значения из файла
reservefile(n,"<наименование файла>") – резервирование памяти для считывания значений из файла (n – количество значений, которые будут считаны из файла)
closefile("<наименование файла>") – оператор закрытия текстового файла
Пример 2.16.
Пусть в файле «textfile.txt» хранятся в виде данных численные значения координат шести пространственных точек ( X Y Z). Задание исходных данных в этом случае будет состоять в открытии этого файла, считывании из него числовых значений координат точек и занесении их в массивы чисел «x0», «y0», «z0» . Рассмотрим фрагмент программы, осуществляющий задание исходных данных.
………………
array x0[10], y0[10], z0[10]; - - массивы исходных данных
fs = openfile("r","1.txt") ; - - открытие файла с именем «textfile.txt»,
присвоение переменной fs значения либо 0, либо 1 в случае удачного или неудачного открытия файла. Здесь в качестве параметра функции используется символьное значение "1.txt".
r=reservefile(30,"1.txt") ; - - резервирование в памяти места для считывания 30 значений
i = 1;
while (i < 11) loop - - оператор цикла считывания данных из файла, где значение i изменяется от 1 до 10
x0[i] = rfile("1.txt"); - - считывание и занесение текущего значения переменной x в массив x0 из файла
y0[i] = rfile("1.txt"); - - считывание и занесение текущего значения переменной y в массив y0 из файла
z0[i] = rfile("1.txt"); - - считывание и занесение текущего значения переменной z в массив z0 из файла
i = i+1;
endloop; - - окончание цикла
fs = closefile("1.txt"); - - закрытие файла
……………………
Функциональные процедуры фильтрации данных
В программном продукте HyperFun, также как и в 3ds Max, отсутствуют программные средства, которые можно использовать в качестве программных функциональных процедур фильтрации. Эти функциональные процедуры надо описывать в теле программы, используя существующие возможности на языке HyperFun. Для этого могут быть использованы различные типы операторов MaxScript, упомянутые выше.
Пример 2.17
Будем рассматривать в качестве исходных данных численные значения координат десяти пространственных точек из предыдущего примера. Пусть фильтрация исходных данных состоит в том, чтобы из числа исходных 10-ти точек нужно для последующей визуализации отобрать только те из них, которые лежат внутри куба. Грани этого куба параллельны координатным плоскостям, координаты левого нижнего угла (-5,-5,-5), координаты правого верхнего (5,5,5). Отфильтрованные данные заносятся в массивы x2, y2, z2 соответственно. Фрагмент прикладной программы визуализации, описывающий функциональную процедуру фильтрации, будет иметь следующий вид:
……………………………
array x2[10], y2[10], z2[10]; - - массив значений отфильтрованных точек
……………………………
i=1;
numsp=1; - - переменная, задающая количество отфильрованных точек
while (i < 11) loop - - оператор цикла, где значение переменной i меняется от 1 до 10
if ((x0[i] >-5) and (x0[i]<5) and (y0[i]>-5) and (y0[i]<5) and (z0[i]<5) and (z0[i]>-5)) then
- - оператор условия, проверка нахождения точки внутри куба
x2[numsp] = x0[i]; - - занесение выбранного значения переменной x в массив
y2[numsp] = y0[i]; - - занесение выбранного значения переменной y в массив
z2[numsp] = z0[i]; - - занесение выбранного значения переменной z в массив
numsp=numsp+1;p>
endif; - окончание оператора условия
i=i+1;
endloop; - окончание цикла
……………..
Следует отметить, что, также как и в 3ds Max , необязательно размещение функциональной процедуры фильтрации в теле прикладной программы (как мы это сделали в рассмотренном примере). Из прикладной программы визуализации могут вызываться с помощью оператора функции также и нештатные процедуры фильтрации. Это замечание справедливо не только в отношении функциональных процедур фильтрации, но и любых других нештатных функциональных процедур, определяемых человеком.
Функциональные процедуры мэппинга
HyperFun, также как и MaxScript, обладает богатым набором функциональных процедур мэппинга. Как упоминалось выше, под функциональными процедурами мэппинга (как указывалось ранее, мы рассматриваем 3d мэппинг) понимаются процедуры формирования компьютерных представлений описаний пространственных сцен, которое включает в себя описание геометрии (геометрической модели) этой сцены и описание ее графических характеристик (текстуры).
Геометрическая модель пространственной сцены представляет собой совокупность пространственных геометрических примитивов или/и сложных геометрических объектов (являющихся результатом выполнения некоторых геометрических операций над пространственными геометрическими примитивами или другими сложными объектами). В качестве таких геометрических примитивов в HyperFun могут использоваться:
·cфера
·эллипсоид
·цилиндр
·эллиптический цилиндр
·конус
·эллиптический конус
·тор
·суперэллипсоид
·параллелепипед
·конволюционная поверхность на основе треугольников
·конволюционная поверхность на основе каркасных отрезков линии
·блобби
·метабол
·и др.
Из этих примитивов можно формировать сложные пространственные геометрические объекты, которые, в свою очередь, могут использоваться как операнды других геометрических операций. В качестве таких геометрических операций в HyperFun могут использоваться:
·сдвиг
·поворот
·масштабирование
·скручивание
·растяжение
·кубическое отображение
·сглаживающее объединение
·сглаживающее пересечение
·теоретико-множественное объединение
·теоретико-множественное пересечение
·теоретико-множественное вычитание
·и др.
Как было отмечено выше, вызов функциональных процедур из прикладной программы визуализации на языке HyperFun осуществляется в основном с помощью операторов функций. Это справедливо и для мэппинга. Приведем примеры операторов функций, используемых для обращения к функциональным процедурам мэппинга. Напомним, что значения параметров в этих операторах функций в прикладной программе визуализации определенным образом связываются с ранее отфильтрованными данными.
Пример 2.18
Оператор функции «сфера»:
hfSphere(x,center,R);
Эта функциональная процедура ставит в соответствие отфильтрованным данным компьютерное представление геометрической модели пространственной сцены в виде сферы. Задаваемые параметры:
x – массив входных переменных x,y,z описывающей функции f(x,y,z) сenter – массив координат центра сферы
R – радиус сферы
Для сферы описывающая функция имеет вид:
f(x,y,z) = R^2 – (x – center[1])^2 + (y – center[2])^2+(z – center[3])^2
Нетрудно видеть, что величины center[1], center[2], center[3] и R по отношению к описывающей функции f(x,y,z) являются ее параметрами.
Следует отметить, что задание сферы может осуществляться также с помощью следующей синтаксической конструкции:
Sphere = R^2 – (x – center[1])^2 + (y – center[2])^2+(z – center[3])^2 ;
Это замечание справедливо для задания любого примитива в HyperFun.
Пример 2.19
Оператор функции «эллипсоид»:
hfEllipsoid(x,center,a,b,c);
Эта функциональная процедура ставит в соответствие отфильтрованным данным компьютерное представление модели пространственной сцены в виде эллипсоида. Задаваемые параметры:
x – массив входных переменных x,y,z описывающей функции f(x,y,z) сenter – массив координаты центра эллипсоида
a,b,c – полуоси эллипсоида
Пример 2.20
Операторы сдвига сферы на величины dx,dy,dz вдоль координатных осей.
hfShift3D(x,dx,dy,dz);
s2 = hfSphere(x,center,R);
Первый оператор обеспечивает преобразование значений входных переменных x,y,z по формулам:
x=x - dx
y=y - dy
z=z - dz
Второй оператор обеспечивает построение компьютерного представления новой описывающей функции сферы f(x,y,z) с учетом преобразованных x,y,z.
Пример 2.21
Как было указано выше, для инициации функциональных процедур могут использоваться не только операторы функций. Так, для инициации функциональной процедуры объединения двух ранее созданных геометрических объектов используется геометрический оператор теоретико-множественного объединения:
f3 = f1|f2;
Эта функциональная процедура ставит в соответствие двум ранее созданным геометрическим объектам f1 и f2 компьютерное представление геометрической модели пространственной сцены в виде сложного геометрического объекта f3, являющегося результатом геометрической операции теоретико-множественного объединения этих объектов.
Пример 2.22
Рассмотрим фрагмент прикладной программы визуализации, которая ставит в соответствии ранее отфильтрованным данным пространственную сцену в виде совокупности сфер.
………………………..
array sph[10]; - - массив сфер
array center[3]; - - массив центра сферы
…………………………
center[1]=x2[1]; - - заполнение значений массива центра сферы первыми значениями массивов координат x2,y2,z2
center[2]=y2[1];
center[3]=z2[1];
sph[1]=hfSphere(x,center,0.5); - - создание сферы с радиусом 0.5 и центров с точке со значениями массива center
i=2;
while (i <numsp) loop - - начало оператора цикла, переменная i меняется от 1 до числа отфильтрованных точек
center[1]=x2[i]; - - заполнение значений массива центра сферы текущими значениями массивов координат x2,y2,z2
center[2]=y2[i];
center[3]=z2[i];
sph[i] = hfSphere(x,center,0.5); - - создание сферы с радиусом 0.5 и центров с точке со значениями массива center
sph[1]=sph[1]|sph[i]; - - объединение ранее созданных сфер, начиная с первой, с текущей и присвоение результата объединения переменной sph[1]
i=i+1;
endloop; - - окончание цикла
……………………………
До этого мы рассматривали характеристики и примеры инициации функциональных процедур мэппинга, служащих для задания геометрической модели сцены. Перейдем к функциональной процедуре мэппинга, с помощью которой можно задавать цветовые атрибуты.
Как уже было отмечено выше, в HyperFun используется массив атрибутов s[3] для задания графических характеристик. Приведем пример использования этого массива для задания цвета пространственного объекта.
Пример 2.23
……………………………
s=[0,0,1]; - - задание значений массива, которые будут использованы в качестве значений составляющих цвета (красный, зеленый, синий) по модели RGB
……………………………
Функциональные процедуры рендеринга
Как было упомянуто выше, функциональные процедуры рендеринга ставят в соответствие компьютерному представлению описания (модели) пространственной сцены ее проекционное графическое изображение на используемом графическом терминале.
Рендеринг имеет ряд параметров, к ним относятся: камера, источники освещения
исреда. В HyperFun инициация функциональных процедур рендеринга осуществляется не в прикладной программе, а через командную строку или диалоговый режим. Например, можно управлять параметрами камеры (позиция, направление зрения), размерами обрамляющего параллелепипеда, определяющего визуализируемую область пространственной сцены, цветом фона
ит.д.
Результатом рендеринга может быть также и анимационное (динамическое, зависящее от времени) проекционное графическое изображение, которое представляет собой соответствующую временную последовательность статических проекционных графических изображений рассматриваемой сцены. Так, например, если каждое такое статическое проекционное изображение получено с помощью меняющейся во времени пространственной сцены – шара, постепенно превращающегося в куб. Приведем пример такой анимации. Отметим, что в этом примере, в отличие от примера 2.14 в предыдущем параграфе, последовательность проекционных графических изображений получается не за счет изменения позиции камеры, а за счет изменения самой пространственной сцены (шара, превращающегося в куб).
Пример 2.24
anim(x[4],a[1]){
array xx[3],center[3], vertex[3]; - - инициализация массивов текущих точек,
центров сферы и кубика
xx[1]=x[1]; xx[2]=x[2]; xx[3]=x[3]; - - присвоение массиву значений координат текущей точки
center = [0,0,0]; - - задание центра сферы
object0 = hfSphere(xx,center,6); - - задание сферы vertex=[-8,-8,-8]; - - задание центра кубика
object1 = hfBlock(xx,vertex,16,16,16); - - задание кубика
anim = object0*(1-x[4]) + object1*x[4]; - - метаморфозис (линейная интерполяция с использованием двух обетов: шара и куба)
}
Здесь переменная x[4] задается дискретным набором чисел и интерпретируется как время.
Пример 2.25
Приведем пример прикладной программы визуализации исходных данных из примера 2.16. Результатом работы этой программы будет статическое проекционное графическое изображение пространственной сцены, получаемое в результате фильтрации из примера 2.17, и мэппинга, описанного в примерах
2.22,2.23.