【问题标题】:Model rotating on Z-axis is offZ轴旋转模型关闭
【发布时间】:2014-07-02 06:38:25
【问题描述】:

我试图通过矩阵在它自己的轴上旋转一个对象,但我遇到了一个问题。在 X 或 Y 轴上旋转会产生预期的结果,但在 Z 轴上旋转时,整个模型似乎围绕 Z 轴旋转,就好像它下面有一个看不见的极点一样,当从X或Y轴,隐形极点贯穿模型。

glm::mat4 rotateMatrix(GLfloat angle, glm::vec3 axis)
{
    axis = glm::normalize(axis);
    GLfloat s = sin(angle);
    GLfloat c = cos(angle);
    GLfloat oc = 1.0f - c;

    return glm::mat4(
        oc * axis.x * axis.x + c,          oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0,
        oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c,          oc * axis.y * axis.z - axis.x * s, 0.0,
        oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c,          0.0,
        0.0,                               0.0,                               0.0,                               1.0
        );
}

绘图功能内:

_prog.setUniform("Translation", glm::vec3(0.0f, 20.0f, -20.0f));
_prog.setUniform("Rotate", rotateMatrix(45.0f, glm::vec3(0.0f, 0.0f, 1.0f)));
_model.render();

【问题讨论】:

  • 旋转矩阵看起来是正确的。但“翻译”的目的是什么?如果删除绘图函数的那一行会发生什么?
  • @DavidK "Translation" 是 GLSL 中的 vec3,用于在世界中移动/定位模型。我使用它很像 glTranslatef(float, float, float)。
  • 它似乎会做一些事情。我只是没有在其他任何地方看到这种特殊的符号。但是您似乎在旋转之前进行了翻译,这很容易引起问题(如@Sunius 的回答中所述)。这就是为什么我问如果你根本不翻译会发生什么。
  • 另一个问题:您的模型相对于坐标轴您对其执行这些操作之前在哪里?也就是说,在平移之前,最小/最大 x 坐标、最小/最大 y 坐标、最小/最大 z 坐标的原始范围是多少?

标签: c++ opengl matrix rotation


【解决方案1】:

如果您旋转已翻译的模型,就会发生这种情况。检查您的转换顺序是否正确:

  1. 比例模型;
  2. 旋转模型;
  3. 翻译模型;

另外,请确保模型本身位于坐标系的原点。

【讨论】:

  • 这在很大程度上取决于矩阵库的实现方式。如果它与 OpenGL 匹配(与 glm 匹配),那么它是列优先的并且使用后乘法。在这种情况下,您调用这些单独操作的顺序是相反的。
  • 从技术上讲,“操作顺序”是相同的。棘手的部分是,如果您通过将矩阵相乘来组合运算,请记住“第一个”运算是由最右边的矩阵还是最左边的矩阵定义的。在这个例子中,运算不是由矩阵乘法组成的,所以我认为这个特别的问题不适用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2011-08-22
  • 1970-01-01
相关资源
最近更新 更多