【发布时间】:2011-05-10 10:52:43
【问题描述】:
我有一些 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 的引用也将不胜感激)
【问题讨论】:
-
颠倒变换顺序有什么问题?
-
如果您先执行 glTranslatef() 然后执行 glRotatef() 您将首先旋转对象而不是平移它,否则如果顺序颠倒您将首先平移它然后旋转它。看看这里glprogramming.com/red/chapter03.html
标签: iphone objective-c opengl-es translate glrotate