OpenGL ES 2.0(或Marmalade SDK)中类似于OpenGL ES 1.x中“glRotate()”、“glTranslation()”命令顺序的效果。

5
在OpenGL ES 1.x中,可以先使用glTranslate,然后再使用glRotate来修改旋转中心的位置(即围绕给定点旋转)。据我所知,在OpenGL ES 2.0中,矩阵计算是在CPU端完成的。我正在使用IwGeom(来自Marmalade SDK)-一个典型的(可能)矩阵包。根据文档:
"IwGeom中的矩阵实际上是4x3格式,包括一个3x3的旋转和一个3分量向量的平移。"
我发现使用这种方法很难获得相同的效果。平移总是在旋转之后应用。此外,在Marmalade中,还设置了模型矩阵:
IwGxSetModelMatrix( &modelMatrix );

显然,旋转和平移也按照一定顺序应用:a)旋转,b)平移。

如何获得OpenGL ES 1.x效果?

1个回答

4

Marmalades IwGX是一个封装了OpenGL的工具,它更类似于GLES 1.0,因为它不需要着色器。

glTranslateglRotate用于修改视图矩阵。

您可以替换为:

CIwFMat viewMat1 = IwGxGetModelMatrix();
CIwFMat rot; rot.SetIdentity(); rot.SetRotZ(.....); // or other matrix rotation function
CIwFMat viewMat2 = viewMat1; 
viewMat2.PostMult(rot); // or viewMat2.PreMult(rot);
IwGxSetModelMatrix(viewMat2);
// Draw Something
IwGxSetModelMatrix(&viewMat1);

如果您使用 GLES 2.0,则矩阵也可以在顶点着色器中计算。这可能比使用 CPU 更快。iPhone 4S 上带有 NEON 指令的 CPU 具有类似的性能。


1
我可以请您澄清一下吗?如何包含翻译?或者换句话说,如何围绕点(x,y,z)旋转? - Sydnic
1
这是你的公式:V2 = V1 * R * T。我已经有一段时间没有使用IwGx了,但我几乎可以确定M1 = M1 * M2M1.PostMult(M2),而M1 = M2 * M1M1.PreMult(M2) - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接