- •Содержательная и формальная постановки задачи
- •Структура решения
- •Моделирование поверхности
- •Программное представление поверхности:
- •Геометрические преобразования
- •Определение цвета точек поверхности
- •Вычисление нормали поверхности в данной точке
- •Определение косинуса угла между направлением нормали и направлением на источник света (наблюдателя)
- •Определение косинуса угла между нормалью и векторов источника света
- •Определение цвета точки
- •Подсчёт нормалей можно осуществить с помощью 2 способов:
- •Определение цвета сегмента
- •Проецирование
- •Визуализация
- •1.Платформа .Net
- •Описание реализации применяемых методов
- •Моделирование поверхности в исходном положении
- •Геометрические преобразования
- •Определение цвета сегмента поверхности
- •Визуализация
- •Проецирование.
- •Визуализация.
- •Руководство пользователя
- •Результаты
-
Геометрические преобразования
Этап выполнения аффинных преобразований был рассмотрен в рамках предыдущих лабораторных работ. Поэтому здесь рассмотрим лишь наиболее важные его моменты.
Переход из одной прямолинейной координатной системы в трёхмерном пространстве к другой описывается следующим образом:
[x* y* z* 1] = [x y z 1][A], где А – матрица преобразования. В частности, матрицы поворотов вокруг осей координат имеют следующий вид:
-
вокруг оси X на угол :
-
вокруг оси Y на угол :
-
вокруг оси Z на угол :
Матрица переноса (сдвиг, перемещение) на вектор имеет вид:
При этом стоит учесть, что при изменении параметров поверхности координаты ее точек пересчитываются заново, а ориентация поверхности в пространстве должна быть сохранена. В силу некоммутативности умножения матриц, случай перемножения базовых матриц соответствующих аффинных преобразований здесь не подходит. Возникает проблема, которую можно решить следующими способами:
-
Хранить матрицу преобразований, умножая ее на матрицы изменений, после чего сохранять полученный результат. Изначально она является единичной.
Затем при повороте вокруг какой-либо оси умножается на соответствующую матрицу поворота, но построенную не по текущему значению угла поворота (, или ), а по изменению соответствующего угла (, ).
Другими словами, пусть А – матрица преобразований, изначально это единичная матрица, что соответствует исходному положению поверхности. При выполнении пользователем поворота вокруг одной из осей координат, нужно вычислить матрицу, соответствующую данному повороту R∆, и умножить матрицу А на R∆. После этого полученную матрицу А можно будет использовать непосредственно для выполнения преобразований точек поверхности. Если же произойдет изменение параметров поверхности, и , следовательно, будут изменены точки, соответствующие исходному положению поверхности, то достаточно будет выполнить их преобразования с использованием уже имеющейся у нас матрицы А. Недостаток этого метода в невозможности выполнить обратные преобразования.
-
Базовый подход. Хранение цепочки последовательности произведенных действий.
Недостаток этого метода ресурсоемкость, т.к. придется каждый раз заново перемножать координаты точек поверхности на матрицы проделанных преобразований.
Поскольку в данной работе возможность выполнения обратных преобразований не требуется, будем использовать первый способ. Его алгоритм следующий:
Обобщенный алгоритм:
{
если изменился какой-либо параметр поверхности
провести этап геометрического моделирования
если изменился угол поворота
умножить результирующую матрицу на соответствующую матрицу поворота
умножить координаты точек поверхности на результирующую матрицу
}
-
Определение цвета точек поверхности
Один из простейших способов определения цвета (интенсивности) точки поверхности заключается в том, что он считается пропорционально косинусу угла, образованного между нормалью к данной точке и направлением на источник света. В данном случае наблюдатель и источник света совмещены и находятся в т.(0, 0, 1, 0). Чем меньше угол между нормалью и вектором к точке [0,0,1,0] , тем больше косинус этого угла, и соответственно тем больше интенсивность данного сегмента.
x
z
источник света и наблюдатель (0, 0, 1, 0)
В виде формулы это можно записать следующим образом:
Где -итоговая интенсивность сегмента;
-угол между вектором нормали к данному сегменту и вектором к точке наблюдения (освещения) - [0,0,1,0];
При положительном косинусе сегмент является внешним и -внешняя интенсивность, при отрицательном косинусе сегмент является внутренним, и -внутренняя интенсивность;
Обобщенный алгоритм определения цвета точки:
{
Вычислить нормаль поверхности в данной точке
Определение косинуса угла между направлением нормали и направлением на источник света (наблюдателя)
Определение цвета точки
}