这是交易,我正在使用opengl ES编写2D框架/游戏引擎。我正在使用VBO和正射投影在整个屏幕上绘制精灵的排列(作为测试的一部分),一切都很顺利,直到我不得不玩翻译和旋转。我遇到的具体问题是,当我在旋转之前使用glTranslatef()应用转换时,该函数不仅会移动精灵,还会移动我的原点,搞乱我的整个转换。我百分百肯定它是这样工作的,因为我使用了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();正在移动,精灵和起源,我做错了什么或误解了翻译的内容?
提前致谢。
答案 0 :(得分:0)
您可能需要使用glPushMatrix和glPopMatrix,因为在翻译和轮换之后您所做的任何事情都会受到影响
但你所描述的实际上它是如何工作的,如果你使用翻译,那会成为你的新起源,因为一旦你翻译,之后的所有内容都会受到翻译的影响,这就是为什么你需要推送和pop,所以你可以去,推 - >翻译对象和/或旋转 - >流行,然后你可以使用你需要做的任何其他翻译,而不必使之前的翻译影响其他一切
起初它有点令人困惑但谷歌周围,你会看到如何正确使用它们http://www.khronos.org/opengles/sdk/1.1/docs/man/glPushMatrix.xml
答案 1 :(得分:0)
我认为你误解了矩阵在openGL中是如何工作的。当你进行矩阵运算,例如glRotatef和glTranslatef时,矩阵会成倍增加,从而影响基矢量。例如,假设我们只绘制一个从(0,0,0)开始的点。如果你调用translate(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,glTranslate和glScale。他们倾向于使事情变得非常讨厌。另一种方法是直接从基矢量构造一个矩阵:只需很少的数学运算就可以根据原点,宽度,高度和旋转等参数计算“方形视图”的所有4个点。这四个点是(A源) ),(B-左下点),(C-右下点),(D-右上点)你的基本矢量是(BA),(DA)和归一化(dotProduct((BA),(DA)))这3个矢量可以插入GL矩阵的左上角3x3矩阵(女巫是4x4或浮动[16]),它们代表旋转和缩放,所以你需要添加的是翻译部分(只需谷歌一点这种方法)。