使用glRotate和glTranslate进行碰撞检测

3

假设我使用 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个回答

3

用于碰撞检测的对象通常不是用于显示的对象。它们通常更简单,速度更快。
因此,是的,做法是保持您手动使用的转换,但您不会重复工作,因为这些对象是不同的。


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类继承自向量类

希望这会有所帮助!:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接