【发布时间】:2013-10-05 00:27:16
【问题描述】:
所以我这里有个函数
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 或类似的东西,我想自己做矩阵数学。
【问题讨论】:
-
没有足够的信息,但你知道 sin 和 cos 是弧度的,对吧?
-
是的,它似乎可以在世界 Y 轴上正常旋转(所以当它在原点旋转时它实际上达到了我想要的效果)但它不会在本地对象的 y 轴上旋转像我想要的任何其他地方,它只围绕世界 Y 轴旋转。
-
我添加了一些 cmets 以便更清楚地了解发生了什么
-
您希望这段代码如何使用任何局部坐标系?任意轴不能由三个值定义。您将始终需要轴的固定点。如果要支持轴的任意位置,则至少需要四个参数。还是已经在某处定义了局部坐标系?
-
你不是先翻译再旋转吗?即:在旋转之前转换为世界空间。在 OpenGL 代码中,如果您想在本地旋转对象,您可以在 glRotate 之前调用:glTranslate。也许我误解了。此外,您应该使用库或创建自己的类来处理矩阵,这只会让您自己感到烦恼。
标签: c opengl matrix 3d rotation