-
Notifications
You must be signed in to change notification settings - Fork 9
43. Учет фактуры при создании реалистических изображений.
Под фактурой, или текстурой, в компьютерной графике понимается детализация строения поверхности. Как правило, рассматривают два вида детализации. В первом случае на гладкую поверхность объекта наносят заданный рисунок (узор). В этом случае поверхность остается гладкой. Во втором случае ставится задача создания неровностей на поверхности, т.е. создания шероховатой поверхности.
Проективные текстуры
Задается в некоторой (обычно двумерной) системе координат рисунок, подлежащий нанесению на трехмерную поверхность. Тогда для наложения заданного рисунка на поверхность необходимо найти функцию отображения или, другими словами, произвести преобразование координат.
Проективным текстурам присущи определенные недостатки. Во-первых, для хранения используемых изображений требуется достаточно большой объем памяти. Во-вторых, они не обладают гибкостью, а, в-третьих, возможны большие сложности при подборе способа проектирования при нанесении рисунка на объекты сложной формы. На практике используют ограниченное количество вариантов проектирования: плоское (параллельное проектирование), цилиндрическое и сферическое.
Процедурные текстуры
Необходимо найти функцию C(X,Y,Z), определяющую для каждой точки поверхности цвет таким образом, чтобы он соответствовал цвету моделируемого материала (наносимого рисунка). Такой подход не требует больших затрат памяти и хорошо работает с поверхностями любой сложности. Но поскольку используемая функция зависит от большого количества параметров, то возникают сложности в подборе этой функции, с другой стороны, изменение этих параметров позволяет легко изменять свойства текстуры.
Неровности
В первом случае можно оцифровать фотографию нерегулярной фактуры и отобразить ее на поверхность. Однако при этом неровности будут восприниматься как нарисованные на гладкой поверхности, т.е. изображение будет не полностью реалистическим. Это связано с тем, что в векторе нормали к реальной шероховатой поверхности, а следовательно, в направлении вектора отражения, есть небольшая случайная составляющая. Этот факт и лег в основу способа моделирования неровностей на отображаемой поверхности.
Пусть Q(X,Y) – уравнение поверхности, т.е. функция Q позволяет для каждой точки поверхности определить ее третью координату Z. В произвольной точке поверхности частные производные по направлениям X,Y лежат в плоскости, касательной к поверхности в этой точке. Нормаль в точке поверхности может определяться векторным произведением этих производных Q’x, Q’y: N=[Q’x, Q’y]
Для создания шероховатой поверхности можно создать новую поверхность путем внесения возмущения в направлении нормали в точках поверхности. Пусть P(X,Y) – функция возмущения, тогда радиус-вектор точки на новой поверхности будет определяться из Qн(X,Y) = Q(X,Y) + P(X,Y) N/│N│ Нормаль к новой возмущенной поверхности будет иметь вид: Nн=[Q’нx, Q’нy]
Частные производные Q’нx , Q’нy вычисляются из следующих выражений: Q’нx = Q’x + P’x(X,Y) N/│N│ + P(X,Y) (N/│N│)x Q’нy = Q’y + P’y(X,Y) N/│N│ + P(X,Y) (N/│N│)y
Последними слагаемыми можно пренебречь, так как функция возмущения P(X,Y) - очень маленькая величина.
Теперь можно записать выражение для вычисления нормали к возмущенной поверхности:
Nн=[Q’нx, Q’нy] + P’y(X,Y)([Q’x, N/│N│]) + P’x(X,Y)([N/│N│, Q’y] ) + P’x(X,Y) P’y(X,Y)( [N, N/│N│^2])
Учитывая, что первое слагаемое представляет собой нормаль к исходной поверхности, а последнее слагаемое равно нулю как векторное произведение коллинеарных векторов, окончательно получим:
Nн= N + P’y(X,Y)([Q’x, N/│N]│) + P’x(X,Y)([N/│N│, Q’y] )
Для моделирования искажений вводится шумовая функция R(X,Y,Z), которая должна удовлетворять следующим требованиям: 1. она должна быть непрерывной; 2. принимать значения из интервала [0,1]; 3. вести себя аналогично равномерно распределенной случайной величине.
Одним из способов задания такой функции является задание случайных значений в узлах некоторой регулярной сетки (в точках i,j,k, принадлежащих множеству целых чисел) и последующей интерполяции на все остальные точки. Для отыскания значения функции в произвольной точке сначала надо определить параллелепипед, содержащий данную точку внутри себя, затем, используя значения функции в вершинах параллелепипеда и проводя интерполяцию, найти значений функции в исходной точке. Для использования целочисленной решетки может быть предложено следующее задание функции:
W(t) – одномерная весовая функция, в простейшем случае w(t)=t, t[0,1].
Использование приведенной трилинейной интерполяции дает не очень хорошие результаты, так как на границе параллелепипеда происходит разрыв первых производных, т.е. функция не является гладкой. Для достижения гладкости на функцию следует наложить условие W’(0)=W’(1)=0. Простейшим вариантом функции, удовлетворяющей этому условию, является многочлен Эрмита: W(t)=3t^2 – 2t^3, t[0,1].
Если функция возмущения не описывается аналитически, ее можно задать двумерной таблицей цветов. Промежуточные значения вычисляются билинейной интерполяцией табличных величин, а производные вычисляются методом конечных разностей.