物体通过世界轴而不是局部轴OpenGL旋转

时间:2013-10-05 00:27:16

标签: c opengl matrix 3d rotation

所以我在这里有一个功能

void rotateLocal(GLfloat deg, GLfloat x, GLfloat y, GLfloat z)

其中x,y,z是您要为此对象旋转的局部轴的坐标。我使用(0,1,0)进行测试,但它仍然只围绕世界y而不是本地y旋转。以下是此函数中对象的一个​​顶点的逻辑:

ax = x;
ay = y;
az = z;

//normalize
length = sqrt((ax * ax) + (ay * ay) + (az * az));
ux = ax / length;
uy = ay / length;
uz = az / length;

//square these
uxS = ux * ux;
uyS = uy * uy;
uzS = uz * uz;

getx = vertex[0];
gety = vertex[1];
getz = vertex[2];

//find new vertex points using rotation matrix for local axis
vertex[0] = (getx * (uxS + cos(deg) * (1 - uxS))) + (gety * (ux * uy * (1 - cos(deg)) - uz * sin(deg))) + (getz * (uz * ux * (1 - cos(deg)) + uy * sin(deg)));
vertex[1] = (getx * (ux * uy * (1-cos(deg)) + uz * sin(deg))) + (gety * (uyS + cos(deg) * (1 - uyS))) + (getz * (uy * uz * (1 - cos(deg)) - ux * sin(deg)));
vertex[2] = (getx * (uz * ux * (1-cos(deg)) - uy * sin(deg))) + (gety * (uy * uz * (1-cos(deg)) + ux * sin(deg))) + (getz * (uzS + cos(deg) * (1-uzS)));

我的旋转矩阵有问题吗?我在某处使用了不正确的变量吗?

注意:我不想使用RotateGL或类似的东西,我想自己做矩阵数学。

1 个答案:

答案 0 :(得分:1)

问题在于您以世界坐标表示轴。你要做的是:

  • 获取所需对象的局部到世界变换矩阵 旋转。
  • 使用此矩阵的反转来转换世界轴(在您的 示例(0,1,0))到本地坐标。
  • 使用转换后的轴来计算您正在进行的旋转 代码。

据我所知,对象的坐标以局部空间表示。

就是这样。