glRotatef 之后 glTranslatef 搞砸了

Posted

技术标签:

【中文标题】glRotatef 之后 glTranslatef 搞砸了【英文标题】:glTranslatef gets messed up after glRotatef 【发布时间】:2020-02-24 00:32:04 【问题描述】:

我是 PyOpenGL 的新手。我使用它编写了一个显示立方体的简单代码,您可以使用键盘在它周围导航。但是,我注意到在调用 glRotatef 命令后,它会改变您的视角,而不是对象的位置。但是, glTranslatef 不适用于透视,而是文字坐标系。换句话说,在调用 glRotatef 命令 90* 之后,本来可以让您向前移动的 glTranslatef 命令现在将您向左移动。是否有像 glTranslatef 这样的函数,只是它会随着旋转而变化,这样您就不会得到奇怪的动作,或者您可以采取某种解决方法来根据旋转更改传递给 glTranslatef 的值?

【问题讨论】:

转换的顺序在 OpenGL 中很重要。您是否尝试过相反的方法? 它可以帮助您在“世界空间”方面保持程序的坐标和旋转,然后每帧执行 gl 转换以获得“屏幕空间”表示形式屏幕。在这些坐标空间之间毕业时尝试回溯通常会导致麻烦,并且如前所述,转换的顺序确实很重要,因此请尝试为此任务创建一致的单向管道,以便让世界逻辑成为世界逻辑和GL逻辑都是GL逻辑 我真的不能反过来做。转换基于用户输入。 【参考方案1】:

glTranslateglRotate 等操作定义了一个(平移或旋转)矩阵,并将当前矩阵乘以新矩阵。matrix multiplication 不是 commutative。如果要旋转模型并独立于旋转平移模型,则必须在平移之前进行旋转,分别将平移矩阵乘以旋转矩阵: (OpenGL矩阵乘法必须从右向左读取):

modelmatrix = translation * rotation

glRotate之前分别是glTranslate

glTranslate(x, y, z)
glRotate(angle, ax, ay, az)

【讨论】:

谢谢你的回答,不幸的是这不是我要找的。翻译是基于用户输入的,所以我无法控制它们。以这种方式思考问题:如果您正在看一个物体的左侧,并且它向前移动,对您来说似乎是向左移动了。我希望它看起来总是在前进,即使从不同的角度来看也是如此。 @user12692182 我明白了。你想要的是第一人称相机。但这不是您在问题中提出的问题。 不是吗?如果你知道我到底要问什么,你能编辑我的问题吗?或者我应该完全提出一个新问题 @user12692182 问题的标题(“glTranslatef 在 glRotatef 后变得一团糟”)具有误导性,没有描述问题。无论如何,我会考虑一个更好的答案。 好的,我会提出一个新问题

以上是关于glRotatef 之后 glTranslatef 搞砸了的主要内容,如果未能解决你的问题,请参考以下文章

从 glLookAt() 到 glRotatef() 和 gltranslatef

OpenGL 转换

c++ OpenGL坐标变换

opengl 中的透明度(使用 FLTK)

无法在openGL中围绕它的中心旋转我的图像

C ++ opengl在glTranslatef之后获得新的顶点位置