所以我在这里有一个功能
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或类似的东西,我想自己做矩阵数学。
答案 0 :(得分:1)
问题在于您以世界坐标表示轴。你要做的是:
据我所知,对象的坐标以局部空间表示。
就是这样。