【问题标题】:Object rotating via world axis and not local axis OpenGL对象通过世界轴而不是本地轴OpenGL旋转
【发布时间】: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


【解决方案1】:

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

  • 获取所需对象的本地到世界转换矩阵 旋转。
  • 使用这个矩阵的倒数来转换世界轴(在你的 例如 (0,1,0)) 到本地坐标。
  • 使用转换后的轴来计算旋转,就像您在 代码。

我了解物体的坐标是以局部空间表示的。

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 2015-07-23
    • 2017-10-26
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2016-09-02
    相关资源
    最近更新 更多