Таким образом, расстояние от источника луча до точки пересечения равно:
(2.11)Второй этап, заключающийся в определении принадлежности точки треугольнику, существенно сложнее и потребует дополнительных рассуждений.
Локальная система координат
Рис. 2.12Введем локальную систему координат
, в которой оси направлены вдоль сторон, причем в пределах треугольника координаты меняются на величину в диапазоне от 0 до 1 и лежат в заштрихованной области (см. рис. 2.12)Для этого введем дополнительные переменные:
(2.12) (2.13) (2.14) (2.15) (2.16)На основании формул (2.13) и (2.14) введем значение координат в точке плоскости треугольника следующим образом:
(2.17)где
- радиус-вектор точки на плоскости, содержащей треугольник. Тогда координаты в исходной точке будут равны: (2.18)где
- радиус-вектор точки .В силу того, что радиус-вектор точки внутри треугольника может быть представлен в виде суммы радиус-вектора точки
и линейной комбинации векторов и , можем записать разницу координат между произвольной точкой внутри треугольника и исходной точкой :Окончательно:
(2.19)Аналогичным образом можно получить:
(2.20)Так как
и являются множителями в линейной комбинации векторов и , дающей в результате вектор, конец которого лежит внутри треугольника, если начало привести в точку , то и меняются в пределах от 0 до 1. Тогда, поделив полученные в формулах (2.19) и (2.20) разницы на величину: (2.21)мы получим требуемый результат – локальные координаты в пределах треугольника меняются не более чем на единицу.
Окончательно имеем формулы для относительных локальных координат:
(2.22)Подставляя найденные на первом этапе координаты точки на плоскости в эти выражения и проверив полученные результаты на нахождение в интервале
и условию , можно сказать, лежит ли точка внутри треугольника, или нет.Нормаль к треугольнику в любой его точке определяется как векторное произведение векторов, задающих его стороны.
2.6.1 Общие сведения
В данной программе предусмотрено наложение на трехмерные объекты текстур и имитация шероховатостей поверхностей. Для этого предусмотрена загрузка битовых карт формата *.bmp из внешних файлов.
Основное отличие фактуры от текстуры – фактура вызывает изменение направления нормали для данной поверхности
2.6.2 Наложение текстуры на треугольник
Для установления соответствия пиксела объекта с пикселом битовой карты необходимо включить точку в формулы (2.22) и, найдя относительные локальные координаты этой точки внутри четырехугольника, определить искомое соответствие, вводя дополнительные множители кратности текстуры.
Этот процесс можно упростить, если принять, что точка
, задающая одну из его вершин и являющаяся точкой отсчета при работе с ними, находится в начале координат. Теперь, зная единичные вектора направления сторон и и соответствующие им кратности повторения текстуры и , можем определить координаты заданной точки на битовой карте: (2.23)где
– радиус-вектор точки .2.6.3 Фактура
Фактурирование – это метод моделирования неровностей изображаемой поверхности без фактического изменения формы модели и с весьма небольшими вычислительными затратами. Фактуры задается битовой картой высот, где участки с высокой интенсивностью означают выпуклости на поверхности, а участки с низкой интенсивностью – впадины.
Фактически метод фактурирования заключается в изменении направления нормали в точке на определенное значение, которое позволяет зрительно исказить поверхность, направив в другую сторону отражение, преломление и блики. Изначальный алгоритм фактурирования предусматривал влияние на результирующую нормаль источника света, однако в данной программе сделано приближение, давшее результат, близкий к реальности: в нормаль вносятся изменения только по осям (ox) и (oz) на величины, не зависящие от источника света.
Для нахождения этих величин сначала необходимо установить соответствие между точкой на поверхности объекта и точкой на битовой карте высот, это осуществляется по алгоритмам, описанным в разделах 2.5.2 – 2.5.3. Затем определяются интенсивности пикселов карты высот, соседних с полученным:
, , , . Теперь можно определить значения смещений по осям: (2.24)Коэффициент A задает зависимость отклонения нормали от внешнего воздействия- в нашем случае ветра.
(2.25)где v – скорость ветра.
Данная формула получена эмпирически и дает наиболее близкие к реальности результаты.
В настоящее время существует множество языков и сред программирования, многие из которых обладают достаточно высокой эффективностью, удобством и простотой в использовании. Однако при разработке данной программы использовался язык C++ по следующим причинам:
· Этот язык предоставляет программисту широкие возможности реализации самых разнообразных алгоритмов, обладая высокой эффективностью и значительным набором стандартных классов и процедур.
· С++ является одним из немногих языков, в полной мере реализующих концепции объектно-ориентированного программирования, позволяющие использовать множественное наследование, абстрактные и параметризованные классы и т.д. Кроме того, трехмерные объекты, также как и математические абстракции, естественным образом представляются в виде объектов классов, что позволяет легко и эффективно организовывать их взаимодействие, при этом сохраняя читаемый и легко изменяемый код. Здесь же следует отметить такое немаловажное свойство объектно-ориентированного подхода, как повторное использование кода. Большая часть из перечисленных преимуществ C++ отсутствует в таких популярных языках, как Pascal и Basic.