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