Введение в трассировку лучей
что каждая поверхность цилиндра проверяется поочередно и допустимые соударения добавляются в «список соударений», включая данные о том, какая поверхность участвует в соударении.
Отметим, что в двух точках соударения необходимо найти нормальный вектор. Как уже говорилось в главе 6, нормаль к стенке цилиндра в точке (х,у,г) имеет вид: (х, у, (s - 1) (1 + (s - l)z)). Нормали к крышке и к основанию равны соответственно (0,0,1) и (0,0, -1). Поля hitNormal заполняются соответствующими значениями с помощью метода hit().
Практические упражнения
14.6.1. Реализация метода hit() для конического цилиндра Проверьте уравнение (14.16) и убедитесь, что коэффициенты квадратного уравнения для конического цилиндра написаны правильно. Конкретизируйте код метода TaperedCylinder :: hit(Ray& г. Intersections inter).
14.6.2. Реализация метода hit() для пересечения с конусом Если бы вы захотели иметь подпрограмму hit(), специально предназначенную для класса Cone, то чем бы она отличалась от той, что написана для класса TaperedCyl i nder? Покажите, какие строки кода должны быть изменены для увеличения эффективности подпрограммы.
14.6.3. О сложности вычислений Сколько сложений/вычитаний и умножений/делений требуется для пересечения луча с квадратом и с коническим цилиндром?
14.6.4. Другие квадратичные поверхности В главе 6 мы рассмотрели представления различных квадратичных поверхностей, таких как гиперболоид и эллиптический конус.
О Как разумно определить базовую версию для каждого типа квадратичной поверхности?
О Для каждой базовой квадратичной поверхности покажите, что поиск пересечения ее с лучом приводит к квадратному уравнению; приведите это уравнение.
14.6.3. Пересечение с кубом (или с любым другим выпуклым полиэдром)
Выпуклые полиэдры доказали свою полезность во многих ситуациях машинной графики и уже рассматривались в некоторых разделах данной книги (см., например, обсуждение Платоновых тел в главе 6). Поскольку выпуклые полиэдры определены в терминах ограничивающих плоскостей, нетрудно разработать подпрограмму пересечения луча с любым выпуклым полиэдром. Мы сделаем это позднее в данном разделе.