gpt4 book ai didi

iphone - 如何使用 glRotatef() 和 glTranslatef() 在 3D 世界中增量移动

转载 作者:行者123 更新时间:2023-12-03 21:09:34 25 4
gpt4 key购买 nike

我有一些在 3D 空间中用 OpenGL 渲染的 3D 模型,但在移动“角色”(即相机)时遇到了一些麻烦)在这个世界内进行旋转和平移。

我从一些外部事件(用户输入的图像或来自 GPS+罗盘设备的一些数据)接收输入(即移动的坐标/转动的坐标),并且事件的类型是旋转/em> 或翻译

我编写了这个方法来管理这些事件:

- (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 的引用也将受到赞赏)

最佳答案

我建议不要在事件处理程序中进行累积转换,而是在内部存储转换的当前值,然后仅转换一次,但我不知道这是否是您想要的行为。

伪代码:

someEvent(lat, long, deg)
{
currentLat += lat;
currentLong += long;
currentDeg += deg;
}

redraw()
{
glClear()
glRotatef(currentDeg, 0, 0, 1);
glTranslatef(currentLat, -currentLong, 0);
... // draw stuff
}

关于iphone - 如何使用 glRotatef() 和 glTranslatef() 在 3D 世界中增量移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4188305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com