【问题标题】:glm combine rotation and translationglm 结合旋转和平移
【发布时间】:2012-04-12 19:39:50
【问题描述】:

我有一个对象,我首先要旋转(围绕它自己的中心),然后将它转换到某个点。我有一个保存旋转的 glm::quat 和一个保存需要翻译的点的 glm::vec3。

glm::vec3 position;
glm::quat orientation;
glm::mat4 modelmatrix; <-- want to combine them both in here

modelmatrix = glm::translate(glm::toMat4(orientation),position);

然后在我的渲染函数中,我会这样做。

pvm = projectionMatrix*viewMatrix*modelmatrix;
glUniformMatrix4fv(pvmMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(pvm));

..并渲染...

不幸的是,当我应用旋转时,对象只是围绕原点运行(“位置”离原点越远,轨道越大)。

当我只申请这个职位时,它翻译得很好。当我仅应用旋转时,它会停留在原点并围绕其中心旋转(如预期的那样)。那么,当我同时应用它们时,为什么会变得很奇怪呢?我错过了一些基本的东西吗?

【问题讨论】:

    标签: opengl 3d transform glm-math


    【解决方案1】:

    因为您以错误的顺序应用它们。通过执行glm::translate(glm::toMat4(orientation),position),您正在执行等效的操作:

    glm::mat4 rot = glm::toMat4(orientation);
    glm::mat4 trans = glm::translate(glm::mat4(1.0f), position);
    glm::mat4 final = rot * trans;
    

    请注意,平移是在矩阵的右侧,而不是左侧。这意味着平移发生首先,然后旋转发生相对于平移。所以旋转发生在平移后的空间中。

    您希望轮换发生首先。所以颠倒矩阵乘法的顺序。

    【讨论】:

    • 我的印象是 glm::translate 将翻译应用于函数的第一个参数。谢谢。
    • @Jubei:它确实将翻译应用于矩阵。它右乘它。这意味着当您希望旋转首先发生时,平移发生首先
    • 感谢您的回答,我今天一直坚持这个问题,但即使我知道我做错了什么,我也无法找到任何确认功能是这样的应该可以工作。
    • 函数为什么会这样倒退?我认为直观的含义是您传入的矩阵在之后应用翻译。这种选择是否有特定原因?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多