Смекни!
smekni.com

Построение реалистических изображений поверхности океана с 3-х мерной лодки которая плавает (стр. 3 из 6)

Функция шума

Рис 2.7

Базовое понятие шума Перлина – это функция шума. Функция шума получает целое число как параметр и возвращает случайное число исходя из него. Причем, если передать тот же самый параметр еще раз, будет получено то же самое число.

Интерполирование функции

Рис 2.8

Интерполированием и сглаживанием можно получить непрерывную функцию, которая определена для действительных чисел.

Для водной поверхности нам нужна 2х мерная функция шума /9/:

(2.6)

Для интерполяции используем косинусную интерполяцию:

, (2.7)

где a,b – два параметра, между которыми мы производим интерполяцию

x - число, от которого зависит результат, если x=0 то возвращается

a, если x=1, то возвращается b

2.3 Система координат

В программе принята следующая система координат: ось (ох) показывает на север, ось (oy) направлена вертикально вверх, ось (oz) направлена на запад.

2.4 Объекты сцены

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 Базовые трехмерные объекты

2.5.1 Сфера

Сфера является одной из наиболее просто аналитически задаваемых объектов. В программе для ее определения хранятся координаты ее центра и длина радиуса.

Задача поиска пересечения луча со сферой достаточно проста и позволяет определить факт отсутствия пересечения на ранних этапах вычисления, что приводит к уменьшению времени выполнения программы и позволяет применять сферу в качестве объемной оболочки объекта, вычисление пересечения луча с которым требует больших вычислительных затрат.

На рис. 2.10 изображена сфера и два пересекающих ее луча, начало одного из которых лежит внутри сферы, а другого – снаружи. Задачу можно рассматривать как плоскую – нахождение пересечения луча с окружностью, в силу того, что через прямую, вдоль которой распространяется луч, и центр окружности, всегда можно провести плоскость, а линия пересечения сферы с плоскостью, проходящей через ее центр, является окружностью с радиусом, равным радиусу самой сферы.

Нахождение точки пересечения луча со сферой

Рис. 2.10

Рассмотрим первый случай, когда начало луча лежит вне сферы – в точке

, направление луча определено единичным вектором
. Чтобы найти точку пересечения, достаточно определить расстояние до нее от начала луча в направлении хода луча, то есть длину отрезка
. Зная координаты центра окружности
, можно определить вектор
, а затем и скалярное произведение
, численно равное длине отрезка
. Если скалярное произведение получилось отрицательным или равным нулю – луч заведомо не пересекает сферу и дальнейшие проверки не производятся.

Иначе находим расстояние от центра сферы до луча – длину отрезка

. В треугольнике
, зная длины
и
, можно найти длину отрезка
. Здесь производится следующая проверка: если
(являющийся расстоянием от центра сферы до луча) больше радиуса сферы, луч сферу не пересекает.

Из треугольника

можно аналогичным образом получить длину отрезка
, вычитая который из известного уже отрезка
, получаем искомое расстояние. Если оно меньше или равно нулю, значит, начало луча лежит на поверхности сферы или же внутри нее (случай луча с началом в
), тогда искомое расстояние вычисляется путем сложения длин отрезков
и
.

Нормаль к поверхности в любой точке сферы вычисляется тривиальным образом как вектор, соединяющий центр сферы с точкой на поверхности.

2.5.2 Треугольник

Треугольник является примитивом, посредством которого могут быть составлены практически любые многогранные тела. Он задается точкой

– одной из вершин треугольника – и двумя векторами
и
, определяющими ориентацию и длины его сторон (см. рис. 2.11).

Треугольник

Рис.2.11 Пересечение луча с плоскостью

Рис. 2.12

Поиск пересечения луча с треугольником состоит из двух этапов: поиск пересечения луча с плоскостью треугольника и определение нахождения точки внутри него.

Первый этап, изображенный на рис. 2.12, достаточно прост; производится проверка, пересекает ли луч плоскость, путем сравнения с нулем скалярного произведения

. Если оно больше или равно нулю, пересечение отсутствует, и дальнейшие действия можно не выполнять. Вектор, соединяющий произвольную точку плоскости (в данном случае это угол треугольника) с началом луча, проецируется на нормаль и делится на косинус угла между направлением луча и нормалью.