使用 glRotate 和 glTranslate 进行碰撞检测

Posted

技术标签:

【中文标题】使用 glRotate 和 glTranslate 进行碰撞检测【英文标题】:Using glRotate and glTranslate with collision detection 【发布时间】:2010-03-25 05:19:09 【问题描述】:

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

我如何获得转换后的顶点以用于碰撞检测?还是我必须自己手动应用转换并因此加倍工作?

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

【问题讨论】:

【参考方案1】:

您用于碰撞检测的对象通常不是您用于显示的对象。它们通常更简单、更快。 所以是的,这样做的方法是维护您手动使用的转换,但您不会因为对象不同而加倍工作。

【讨论】:

【参考方案2】:

您的游戏循环应该如下所示(使用 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 并在正确的时间运行下一帧

** 场景类继承自矢量类

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

【讨论】:

以上是关于使用 glRotate 和 glTranslate 进行碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章

不能从不是原点的其他地方旋转对象

使用openGL应用转换后有没有办法跟踪点

如何绘制一个可以在 OpenGL 中拾取物体的机械臂?

直线移动汽车

C++ Opengl - 使用聚光灯照明

OpenGL 方向。 (从负 z 看的身份旋转)