使用glRotate和glTranslate进行碰撞检测

时间:2010-03-25 05:19:10

标签: c++ c opengl collision-detection

假设我使用glRotate根据一些任意用户输入翻译当前视图(即,如果按下左键,则rtri+=2.5f

glRotatef(rtri,0.0f,1.0f,0.0f);

然后我在旋转位置绘制三角形:

glBegin(GL_TRIANGLES);  // Drawing Using Triangles
    glVertex3f( 0.0f, 1.0f, 0.0f);  // Top
    glVertex3f(-1.0f,-1.0f, 0.0f);  // Bottom Left
    glVertex3f( 1.0f,-1.0f, 0.0f);  // Bottom Right
glEnd();  // Finished Drawing The Triangle

如何获得生成的翻译顶点以用于碰撞检测?或者我是否必须自己手动应用转换,从而加倍工作?

我问的原因是我不介意实施显示列表。

2 个答案:

答案 0 :(得分:3)

用于碰撞检测的对象通常不是用于显示的对象。它们通常更简单,更快捷 所以,是的,这样做的方法是保持你手动使用的转换,但是由于对象不同,你不会加倍工作。

答案 1 :(得分:0)

您的游戏循环应该看起来像(使用c ++语法):

void Scene::Draw()
{
    this->setClearColor(0.0f, 0.0f, 0.0f);

    for(std::vector<GameObject*>::iterator it = this->begin(); it != this->end(); ++it)
    {
        this->updateColliders(it);
        glPushMatrix();
            glRotatef(it->rotation.angle, it->rotation.x, it->rotation.y, it->rotation.z);
            glTranslatef(it->position.x, it->position.y, it->position.z);
            glScalef(it->scale.x, it->scale.y, it->scale.z);

            it->Draw();

        glPopMatrix();
    }

    this->runNextFrame(this->Draw, Scene::MAX_FPS);
}

因此,例如,如果我使用带有立方体的基本盒子对撞机,则绘制方法将:

  • 用黑色填充屏幕(rgb:(0,0,0))
  • 对于每个对象
    • 计算与位置和大小信息的碰撞
    • 保存实际的ModelView矩阵状态
    • 转换ModelView矩阵(旋转,平移,缩放)
    • 绘制立方体
    • 恢复ModelView矩阵状态
    • 检查FPS并在合适的时间运行下一帧

**类Scene继承自矢量类

我希望它会有所帮助! :)