Рассмотрим теперь, каким образом можно определять и обрабатывать столкновения наблюдателя с гранями сцены.

Сначала мы будем считать, что наблюдатель представляет собой единичную сферу, и рассмотрим определение столкновений с одной плоскостью (рис. 8.2, я).

В данном случае на рис. 8.2, в показано неправильное определение точки столкновения, а на рис. 8.2, б - правильное.

Рис. 8.2

В данном случае на рис. 8.2, в показано неправильное определение точки столкновения, а на рис. 8.2, б - правильное.

Для правильного определения столкновений единичной сферы с плоскостью прибавим к центру сферы О единичный вектор, направление которого противоположно направлению нормали к плоскости (-л) (рис. 8.3).

В результате мы получим точку на поверхности сферы, которая в результате движения коснется плоскости

Psph=0-n. (8.1)

Из этой точки мы начинаем движение в направлении вектора скорости v. Выпустим из точки пересечения на сфере psph луч в направлении вектора скорости v. Этот луч описывается уравнением

P = P>rh+t-v. (8.2)

Для определения момента этого столкновения можно воспользоваться методом intersectByRay класса Plane.

Vector3D spherelntersectionPoint =source - plane -> n;
plane --> intersectByRay ( spherelntersectionPoint,
normalizedVelocity, t ) ;
Vector3D pointOnPlane ( spherelntersectionPoint +
t * normalizedVelocity );

Пишем портальный рендерер (часть II)

Однако при этом желательно учесть случай, когда плоскость уже пересекает сферу, т. е. точка касания р к лежит в отрицательном полупространстве относительно плоскости (рис. 8.4).

В этом случае мы будем искать точку не в направлении вектора движения, а в направлении, обратном направлению вектора нормали к плоскости.

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

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

Столкновение сферы с многоугольником несколько сложнее (рис. 8.5, я). Для начала определяется пересечение сферы с плоскостью, проходящей через этот многоугольник. Проблема здесь заключается в том, что найденная точка столкновения сферы с плоскостью грани может и не принадлежать многоугольнику (рис. 8.5, б).


⇐ Предыдущая| |Следующая ⇒