如何使用glRotatef()和glTranslatef()在3D世界中逐步移动
我有一些3D模型,我在OpenGL中在3D空间中渲染,我在移动“角色”(即相机)时遇到了一些令人头痛的问题,在这个世界里有旋转和平移。
我从一些外部事件(图像用户输入或来自GPS +指南针设备的一些数据)接收输入(即,移动/转移dregrees的坐标),并且事件的类型是旋转或平移。
我写过这个方法来管理这些事件:
- (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的引用也将受到赞赏)
没有找到相关结果
已邀请:
2 个回复
唤副埂侧壬
粱委教
然后,您逐步累积旋转并将它们应用于oritentation向量的规范。您可以使用Euler Rotations或Quaternion Rotations来累积您的旋转(由于各种原因,我真的很欣赏四元数方法)。