Collision Detection
Исходный код на котором основан этот урок, взят из моей старой конкурсной работы (ее можно найти на OGLchallenge.dhs.org). Тема называлась “Сумасшедшие столкновения” и моя статья (которая, кстати, заняла первое место :)) была названа Магической Комнатой. Она освещала определение столкновений, моделирование законов физики и эффекты.
Определение столкновений
Трудная тема, и честно говоря, я не знаю до сих пор простых подходов для ее решения. Для каждого приложения существуют различные способы нахождения и проверки столкновений. Конечно, существуют обобщенные физические законы и они могут работать с любыми видами объектов, но они очень медленные.
Мы собираемся исследовать алгоритмы, которые очень быстрые, легкие для понимания и до некоторой степени гибкие. К тому же важно и должно быть рассмотрено, что сделать, когда столкновение определено, и то, как тогда перемещать объекты, в соответствии с законами физики. Мы имеет много материала для рассмотрения. Давайте просмотрим, что мы собираемся изучить:
1) Определение столкновений
2) Моделирование законов физики
3) Специальные эффекты
4) Разъяснение кода
| Lesson30.cpp | : Основной код для этого учебника | ||||
| Image.cpp, | Image.h | : Код загрузки текстур | |||
| Tmatrix.cpp, | Tmatrix.h | : Классы обработки вращения | |||
| Tray.cpp, | Tray.h | : Классы, обрабатывающие операции с лучами | |||
| Tvector.cpp, | Tvector.h | : Классы, обрабатывающие операции с векторами |
В этом коде есть много удобного для дальнейшего использования! Классы операций с векторами, лучами и матрицами очень полезны. Я использую их до сих пор в собственных проектах.




|
Представляет направление и расположение камеры. Камера перемещается, используя функцию LookAt. Как вы, возможно, заметите, в не hook моде (который я объясню позже), вся сцена вращается вокруг, camera_rotation - угол вращения. |
TVector dir Tvector pos(0,-50,1000); float camera_rotation=0; |
|
Представляет ускорение, приложенное к движущимся шарам. В приложении действует как гравитация. |
TVector accel(0, -0.05, 0); |
|
Массив, который содержит новые и старые расположения и векторы скорости каждого шара. Количество шаров жестко установлено равным 10. |
TVector ArrayVel[10]; TVector ArrayPos[10]; TVector OldPos[10]; int NrOfBalls=3; |
|
Временной шаг, который мы используем. |
double Time=0.6; |
|
Если 1, камера меняет вид и следует за шаром (шар с индексом 0 в массиве). Для того чтобы камера следовала за шаром, мы использовали его расположение и вектор скорости для расположения камеры точно за шаром, и установили ее вид вдоль вектора скорости шара. |
int hook_toball1=0; |
|
Структуры, содержащие данные по взрывам, плоскостям и цилиндрам. |
struct Plane struct Cylinder struct Explosion |
|
Взрывы, хранящиеся в массиве фиксированной длины. |
Explosion ExplosionArray[20]; |
|
Выполняет тест на пересечение с примитивами |
Int TestIntersionPlane(….); int TestIntersionCylinder(...); |
|
Загружает текстуры из bmp файлов |
void LoadGLTextures(); |
|
Код визуализации. Визуализация шаров, стен, колонн и взрывов. |
void DrawGLScene(); |
|
Выполнение основной логики симуляции |
void idle(); |
|
Инициализация OpenGL |
void InitGL(); |
|
Поиск, если любой шар сталкивается с другим в текущее время |
int FindBallCol(...); |