Функция шума
Рис 2.7
Базовое понятие шума Перлина – это функция шума. Функция шума получает целое число как параметр и возвращает случайное число исходя из него. Причем, если передать тот же самый параметр еще раз, будет получено то же самое число.
Интерполирование функции
Рис 2.8
Интерполированием и сглаживанием можно получить непрерывную функцию, которая определена для действительных чисел.
Для водной поверхности нам нужна 2х мерная функция шума /9/:
(2.6)Для интерполяции используем косинусную интерполяцию:
, (2.7)где a,b – два параметра, между которыми мы производим интерполяцию
x - число, от которого зависит результат, если x=0 то возвращается
a, если x=1, то возвращается b
В программе принята следующая система координат: ось (ох) показывает на север, ось (oy) направлена вертикально вверх, ось (oz) направлена на запад.
2.4.1 Солнце
Солнце на сцене является сферой, и задается расстоянием от начала координат(удаленность) радиусом сферы, а также направляющим вектором.
Определение единичного направляющего вектора углового положения Солнца происходит на основе даты, времени, широты и угла между осью Х и направлением на юг. Учитывая, что Земля совершает сложное движение, которое складывается из вращательного движения вокруг своей оси и движения вокруг Солнца по почти круговой орбите, можно получить следующие соотношения для координат искомого вектора /7/:
(2.8)где
, здесь , , n – число дней, прошедших с 21 марта, , здесь k – число часов, прошедших с 700,δ – широта,
θ – угол между осью Х и направлением на юг.
Для определения максимальной интенсивности солнца используется следующая формула:
(2.9)где y –ордината единичного направляющего вектора положения солнца.
Данная формула получена чисто императивно.
2.4.2 Лодка
Рис. 2.9
Лодка задается следующими параметрами: длина, ширина, высота борта, длина носа, высота мачты, ширина и высота паруса (см. рис. 2.9).
Мачта лодки имеет квадратное сечение, с длиной стороны равной
длины лодки. Мачта смещена от середины лодки назад на половину ширины паруса.Перемещение лодки определяется по следующей формуле:
(2.10)где
– скорость ветраt - интервал времени между кадрами
- угол между направлением лодки и направлением ветра.Если ветер дует в другую сторону
<0, то лодка стоит и не двигается.2.4.3 Водная поверхность
Для водной поверхности можно задавать только цвет воды. На сцене она представлена как бесконечно большой прямоугольник, центр которого находится в точке (0,0,0). На этот прямоугольник накладывается фактура воды.
2.5.1 Сфера
Сфера является одной из наиболее просто аналитически задаваемых объектов. В программе для ее определения хранятся координаты ее центра и длина радиуса.
Задача поиска пересечения луча со сферой достаточно проста и позволяет определить факт отсутствия пересечения на ранних этапах вычисления, что приводит к уменьшению времени выполнения программы и позволяет применять сферу в качестве объемной оболочки объекта, вычисление пересечения луча с которым требует больших вычислительных затрат.
На рис. 2.10 изображена сфера и два пересекающих ее луча, начало одного из которых лежит внутри сферы, а другого – снаружи. Задачу можно рассматривать как плоскую – нахождение пересечения луча с окружностью, в силу того, что через прямую, вдоль которой распространяется луч, и центр окружности, всегда можно провести плоскость, а линия пересечения сферы с плоскостью, проходящей через ее центр, является окружностью с радиусом, равным радиусу самой сферы.
Нахождение точки пересечения луча со сферой
Рис. 2.10
Рассмотрим первый случай, когда начало луча лежит вне сферы – в точке
, направление луча определено единичным вектором . Чтобы найти точку пересечения, достаточно определить расстояние до нее от начала луча в направлении хода луча, то есть длину отрезка . Зная координаты центра окружности , можно определить вектор , а затем и скалярное произведение , численно равное длине отрезка . Если скалярное произведение получилось отрицательным или равным нулю – луч заведомо не пересекает сферу и дальнейшие проверки не производятся.Иначе находим расстояние от центра сферы до луча – длину отрезка
. В треугольнике , зная длины и , можно найти длину отрезка . Здесь производится следующая проверка: если (являющийся расстоянием от центра сферы до луча) больше радиуса сферы, луч сферу не пересекает.Из треугольника
можно аналогичным образом получить длину отрезка , вычитая который из известного уже отрезка , получаем искомое расстояние. Если оно меньше или равно нулю, значит, начало луча лежит на поверхности сферы или же внутри нее (случай луча с началом в ), тогда искомое расстояние вычисляется путем сложения длин отрезков и .Нормаль к поверхности в любой точке сферы вычисляется тривиальным образом как вектор, соединяющий центр сферы с точкой на поверхности.
2.5.2 Треугольник
Треугольник является примитивом, посредством которого могут быть составлены практически любые многогранные тела. Он задается точкой
– одной из вершин треугольника – и двумя векторами и , определяющими ориентацию и длины его сторон (см. рис. 2.11).Треугольник
Рис.2.11 Пересечение луча с плоскостью
Рис. 2.12
Поиск пересечения луча с треугольником состоит из двух этапов: поиск пересечения луча с плоскостью треугольника и определение нахождения точки внутри него.
Первый этап, изображенный на рис. 2.12, достаточно прост; производится проверка, пересекает ли луч плоскость, путем сравнения с нулем скалярного произведения
. Если оно больше или равно нулю, пересечение отсутствует, и дальнейшие действия можно не выполнять. Вектор, соединяющий произвольную точку плоскости (в данном случае это угол треугольника) с началом луча, проецируется на нормаль и делится на косинус угла между направлением луча и нормалью.