使用 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 进行碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章