我有一些 3D 模型,我在 3D 空间中在 OpenGL 中渲染,并且在这个世界中通过旋转和平移移动“角色”(即相机)时遇到了一些令人头疼的问题。
我从一些外部事件(图像用户输入或来自 GPS + 罗盘设备的一些数据)接收输入(即移动的坐标/要转动的坐标),事件类型是旋转或平移。
我写了这个方法来管理这些事件:
- (void)moveThePlayerPositionTranslatingLat:(double)translatedLat Long:(double)translatedLong andRotating:(double)degrees{
[super startDrawingFrame];
if (degrees != 0)
{
glRotatef(degrees, 0, 0, 1);
}
if (translatedLat != 0)
{
glTranslatef(translatedLat, -translatedLong, 0);
}
[self redrawView];
}
然后在redrawView
我实际上正在绘制场景和我的模型。它是这样的:
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
NSInteger nModels = [models count];
for (NSInteger i = 0; i < nModels; i++)
{
MD2Object * mdobj = [models objectAtIndex:i];
glPushMatrix();
double * deltas = calloc(sizeof(double),2);
deltas[0] = currentCoords[0] - mdobj.modelPosition[0];
deltas[1] = currentCoords[1] - mdobj.modelPosition[1];
glTranslatef(deltas[0], -deltas[1], 0);
free(deltas);
[mdobj setupForRenderGL];
[mdobj renderGL];
[mdobj cleanupAfterRenderGL];
glPopMatrix();
}
[super drawView];
问题是,当平移时,旋转事件一个接一个地被调用:例如,当我增量旋转一些迭代(仍然围绕原点)时,我平移并最终再次旋转,但似乎最后一次旋转没有发生围绕当前(翻译)位置,但围绕旧位置(旧原点)。我很清楚,当转换顺序颠倒时会发生这种情况,但我相信在绘制之后,世界的新中心是由翻译系统给出的。
我错过了什么?我怎样才能解决这个问题?(任何对 OpenGL 的引用也将不胜感激)