14.5. Организация трассировщика луча в приложении а переменной num присваивается значение единица, что означает, что соударение имело место. Если г2 положительно, то данные о следующем соударении помещаются в inter.hit[num]. (Если первое время соударения отрицательно, то данные о втором времени соударения автоматически помещаются в hit[0].)
Данные помещаются в каждую запись соударения с учетом информации о сфере. Например, поскольку сфера является выпуклым объектом, луч должен войти в нее в более раннее время соударения, а выйти - в более позднее. Значение переменной surface устанавливается в нуль, поскольку у сферы только одна поверхность. (Мы разберем это понятие позднее.) Точки (в базовых координатах), в которых луч соударяется со сферой, также записываются в поле hitPoint. Точка соударения всегда (по определению) совпадает с положением луча в данный момент соударения, который находится с помощью следующей функции (см. упражнения):
Point3 rayPos(Ray& г. float t):
// returns the ray's location at time t
// возвращает положение луча в момент времени t
Вычислить нормальный вектор в точке соударения для сферы также нетрудно: поскольку нормаль является радиус-вектором из центра сферы, ее координаты совпадают с координатами самих точек соударения.
Практические упражнения
14.5.1. Преобразуйте луч из координат сцены в базовые координаты
Напишите подпрограмму xfrmRayO, в которой метод hit() используется для преобразования луча в базовые координаты сферы. Особое внимание обратите на различие между преобразованием точки и вектора.
14.5.2. Функция rayPos()
Реализуйте описанную ранее функцию rayPosO. Эта функция принимает луч и время, а возвращает положение луча в этот момент времени.
14.5.3. Когда луч касается сферы
Посмотрите, какие значения будут вычисляться и записываться для случая, когда луч только касается сферы.
14.5.4. О сложности вычислений Насколько дорого обходится пересечение луча со сферой? Сколько умножений, делений и извлечений квадратного корня необходимо произвести для вычисления соударения луча со сферой?