0

这是交易,我正在用 opengl ES 编写一个 2D 框架/游戏引擎。我正在使用 VBO 和正射投影在整个屏幕上绘制精灵排列(作为测试的一部分),一切都进行得很顺利,直到我不得不使用平移和旋转。我遇到的具体问题是,当我在旋转之前使用 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 是精灵的位置,height 和 width 是精灵的大小,angle 是旋转的角度,layer 只是将精灵组织成几层的一种形式,非常简单,对?

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

提前致谢。

4

2 回答 2

0

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

但是您所描述的实际上是它的工作原理,如果您使用翻译,那将成为您的新来源,因为一旦您进行翻译,之后的所有内容都会受到该翻译的影响,这就是您需要推送和弹出的原因,所以你可以去,推 -> 翻译对象和/或旋转 -> 弹出,然后你可以继续你需要做的任何其他翻译,而不会让之前的翻译影响其他一切

一开始有点混乱,但谷歌周围,你会看到如何正确使用它们

http://www.khronos.org/opengles/sdk/1.1/docs/man/glPushMatrix.xml

于 2012-12-04T09:15:16.807 回答
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) (而不是你开始的地方)!

这就是您在“代码片段”中所做的。问题是你没有指定你真正想做的事情,你如何定义你的 verices 也是相对的。如果你想要一个像视图这样的东西,你想要控制一些图像来改变位置和旋转,您可能想要创建一个方形顶点缓冲区,其两个维度(或(-width/2,-height/2)到(width/2,height/2))的值都在 -1 到 1 之间。在这种情况下,对象的基本中心位于 (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 个点。这 4 个点是(A-origin ), (B-左下点), (C-右下点), (D-右上点) 你的基向量是 (BA), (DA) 和归一化(dotProduct((BA), (DA)))这 3 个向量可以插入到 GL 矩阵的左上角 3x3 矩阵(女巫是 4x4 或浮点 [16]),它们代表旋转和缩放,所以您需要添加的只是翻译部分(只需谷歌一下这种方法)。

于 2012-12-04T14:14:13.690 回答