0

所以我在这里有一个功能

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 或类似的东西,我想自己做矩阵数学。

4

1 回答 1

1

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

  • 获取要旋转的对象的本地到世界变换矩阵。
  • 使用此矩阵的逆矩阵将世界轴(在您的示例中为 (0,1,0))转换为局部坐标。
  • 正如您在代码中所做的那样,使用转换后的轴来计算旋转。

我了解对象的坐标以局部空间表示。

就这样。

于 2013-10-06T07:12:47.010 回答