轮换实现错误

时间:2015-07-08 05:54:54

标签: c++ opengl glm-math

我正在尝试使用以下功能实现相机的旋转

mat3 rotate(const float degrees, const vec3& axis) {

    mat3 matrix=mat3(cos(degrees),0.0f,-sin(degrees),
        0.0f,1.0f,0.0f,
        sin(degrees),0.0f,cos(degrees)
        );
    mat4 m4=mat4(matrix)  ;
    return (m4 * vec4(axis,1));
}

但是我无法将mat4转换为mat3。此外,mat4和vec3的乘法也会产生编译错误

2 个答案:

答案 0 :(得分:3)

在return语句中,您将4x4矩阵乘以4维向量。

return (m4 * vec4(axis,1));

这会返回一个vec4,但你的函数声明它返回一个mat3。

但我真的认为你需要回顾一下你要做的事情。相机使用4x4矩阵来定义它的视图矩阵,glm已经为旋转矩阵提供了便利功能。

glm::mat4 viewMatrix( 1.0f );
viewMatrix *= glm::rotate( angle, axis );

答案 1 :(得分:1)

矩阵乘法有规则,具体来说:对于AB,矩阵A中的列数必须等于矩阵B中的行数。将矩阵乘以向量是有效的,因为向量就像一维矩阵,但是,它必须遵循上述规则,因此将mat4(4乘4矩阵)乘以vec3(3x1矩阵) )是不可能的,因为列数不等于行数,你可以做的是创建一个vec4(4x1矩阵)并用1填充最后一个组件,这样你就可以将它乘以{ {1}}矩阵。您可以阅读有关矩阵乘法here的更多信息。

另一件事,比如@David Saxon说,你的函数返回mat4,而你的return语句看起来像mat3,这将产生return (m4 * vec4(axis,1));(4x1矩阵),可能是你得到这个编译错误的原因。

如果您只想旋转矢量而不必使用4x4矩阵,则可以将vec4乘以要旋转的mat3,这将导致{vec3 1}}表示旋转的矢量。