Opengl es glTranslatef()正在移动我的原点和精灵

Opengl es glTranslatef()正在移动我的原点和精灵,opengl-es,translation,Opengl Es,Translation,这里是交易,我正在用opengl ES编程一个2D框架/游戏引擎。我使用VBOs和正交投影在整个屏幕上绘制精灵的排列(作为测试的一部分),在我玩平移和旋转之前,一切都很顺利。我遇到的具体问题是,当我在旋转之前使用glTranslatef()应用平移时,该函数不仅移动精灵,还移动我的原点,从而打乱了我的整个变换。我100%确信它是这样工作的,因为我使用了glTranslatef()将屏幕大小的一半精灵移动到右边和底部(是的,我的原点在左上角),然后应用一个恒定的旋转,东西只是在围绕屏幕中心的圆形路

这里是交易,我正在用opengl ES编程一个2D框架/游戏引擎。我使用VBOs和正交投影在整个屏幕上绘制精灵的排列(作为测试的一部分),在我玩平移和旋转之前,一切都很顺利。我遇到的具体问题是,当我在旋转之前使用glTranslatef()应用平移时,该函数不仅移动精灵,还移动我的原点,从而打乱了我的整个变换。我100%确信它是这样工作的,因为我使用了glTranslatef()将屏幕大小的一半精灵移动到右边和底部(是的,我的原点在左上角),然后应用一个恒定的旋转,东西只是在围绕屏幕中心的圆形路径中不断移动(实际上是旋转的,但不像我预期的那样)

如果您需要一些代码,我们将:

gl.glTranslatef(-(x+width/2), -(y+height/2), -layer);
gl.glRotatef(angle, 0.0f, 0.0f, -1.0f);
gl.glTranslatef(x+width/2, y+height/2, layer);
在这段代码中,x和y是精灵的位置,高度和宽度是精灵的大小,角度是旋转的角度,图层只是将精灵组织成几层的一种形式,非常直接,对吗

同样,我的问题是glTranslatef();正在移动精灵和原点,我是做错了什么还是误解了翻译


提前感谢。

您可能需要使用glPushMatrix和glPopMatrix,因为在这些平移和旋转之后所做的任何事情都会受到它们的影响

但你所描述的实际上是它是如何工作的,如果你使用一个翻译,它会成为你的新原点,因为一旦你做了一个翻译,之后的一切都会受到这个翻译的影响,这就是为什么你需要推动和弹出,这样你就可以,推动->翻译对象和/或旋转->弹出,然后你可以做任何事情你需要做她的翻译,而不要让以前的翻译影响到其他一切

一开始有点混乱,但谷歌搜索一下,你就会知道如何正确使用它们


我认为您误解了openGL中矩阵的工作原理。当您执行glRotatef和GLTRANSTALEF等矩阵运算时,矩阵会相乘,从而影响基向量。例如,假设我们只绘制一个从(0,0,0)开始的点。如果调用TRANSTALE(1,0,0),该点将位于(1,0,0),然后调用rotate(90,0,0,1),您的点将位于与之前相同的位置,但已旋转。现在,最后一次调用是translate(-1,0,0),您的点位于(1,-1,0)(而不是您开始的位置)

这就是你在“代码片段”中所做的。问题是你没有指定你真正想要做什么,你如何定义你的真实性也是相对的。。如果你想要一个视图,其中包含一些你想要控制的图像,在改变位置和旋转的意义上,你可能想要创建一个正方形顶点缓冲区,在两个维度上都有-1到1的值(或者(-width/2,-height/2)到(width/2,height/2))。在这种情况下,对象的基本中心位于(0,0,0)中,这可能是您想要旋转它的点(或者我在这里错了吗?)。因此,当您想要用原点定义对象的位置时,您需要写入translatef(x+width/2,y+height/2,…)

对于这种情况下的整个绘图过程:如果您希望原点位于(x,y,z),具有(宽度,高度)并旋转(角度),则顺序如下

glTranslatef(x,y,z)
glTranslatef(width/2,height/2,0)
glScalef(width/2,height/2, 1) //only if verices defined at (-1,1)
glRotatef(angle, 0, 0, 1)
请注意,在这种情况下,由于围绕对象的中心旋转对象,因此其原点将不再位于(x,y,z)


一般来说,如果可能的话,我建议远离glRotate、GLTRANSPLATE和glScale。它们往往会让事情变得非常糟糕。因此,另一种方法是直接从基向量构建矩阵:只需少量数学运算,就可以计算“方视图”的所有4个点基于原点、宽度、高度和旋转等参数。4个点是(A-原点),(B-左下点),(C-右下点),(D-右上点)基本向量是(B-A),(D-A)和归一化(点积((B-A),(D-A))。这3个向量可以插入GL矩阵的左上角3x3矩阵中(即4x4或浮点[16])它们同时表示旋转和缩放,因此您只需添加平移部分(这种方法只需在谷歌上搜索一下即可)。

作为旁注,这是opengl 1的工作方式,更有用(但更复杂)opengl 2+的做法是为每个对象存储您自己的modelview矩阵,并有一个modelview投影矩阵,它本质上是您的相机位置/方向,然后将它们相乘,得到相机空间中的最终对象位置,这将在着色器中使用。但如果您刚刚开始..小步骤,OpenGL1是开始学习和理解基础知识的好方法