C++ 旋转执行错误

C++ 旋转执行错误,c++,opengl,glm-math,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 *

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

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的相乘会产生编译错误

在返回语句中,您将4x4矩阵乘以四维向量

return (m4 * vec4(axis,1));
这将返回一个vec4,而您的函数声明它将返回一个mat3

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

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

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

return (m4 * vec4(axis,1));
这将返回一个vec4,而您的函数声明它将返回一个mat3

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

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

矩阵乘法有一些规则,特别是:对于AB,矩阵A中的列数必须等于矩阵B中的行数。将矩阵乘以向量是有效的,因为向量类似于一维矩阵,但是,它必须遵循上述规则,因此将
mat4
(4×4矩阵)乘以
vec3
(3x1矩阵)是不可能的,因为列数不等于行数,您可以做的是创建
vec4
(4x1矩阵)并用1填充最后一个组件,从而允许您将其与
mat4
矩阵相乘。您可以阅读有关矩阵乘法的更多信息

另一件事,如@David Saxon所说,您有函数返回
mat3
,而您的return语句类似于
return(m4*vec4(axis,1));
,这将导致
vec4
(4x1矩阵),这可能是您出现此编译错误的原因


如果你只想旋转一个向量,你不必使用4x4矩阵,你只需将
mat3
乘以你想旋转的
vec3
,这将导致一个
vec3
表示旋转的向量。

矩阵乘法有一些规则,特别是:对于AB,矩阵a mu中的列数st必须等于矩阵B中的行数。将矩阵乘以向量是有效的,因为向量类似于一维矩阵,但是,它必须遵循上述规则,以便将
mat4
(4×4矩阵)乘以
vec3
(3x1矩阵)这是不可能的,因为列的数量不等于行的数量,您可以创建一个
vec4
(4x1矩阵)并用1填充最后一个组件,从而允许您将其与
mat4
矩阵相乘。您可以阅读有关矩阵乘法的更多信息

另一件事,如@David Saxon所说,您有函数返回
mat3
,而您的return语句类似于
return(m4*vec4(axis,1));
,这将导致
vec4
(4x1矩阵),这可能是您出现此编译错误的原因


如果你只想旋转一个向量,你不必使用4x4矩阵,你只需将
mat3
乘以你想旋转的
vec3
,这将导致一个
vec3
表示旋转的向量。

mat3、mat4和vec3来自哪里?是glm吗?还有你得到的错误消息是什么?@DavidSaxon是的,我正在使用glm。我会遇到如下错误"无法将参数1从“glm::detail::tvec4”转换为“const glm::detail::tmat3x3&”
matrix*vector=vector
-旋转一个向量会得到一个指向不同方向的新向量。如果我没有弄错,您正在围绕y轴旋转轴。如果这是您想要做的,只需更改返回类型并
return矩阵*轴;
。如果要创建一个围绕
轴旋转的矩阵,请参见例如。mat3、mat4和vec3来自何处?是glm吗?还有您收到的错误消息是什么?@DavidSaxon是的,我正在使用glm。我收到的错误如下:"无法将参数1从“glm::detail::tvec4”转换为“const glm::detail::tmat3x3&”
matrix*vector=vector
-旋转一个向量会得到一个指向不同方向的新向量。如果我没有弄错,您正在围绕y轴旋转轴。如果这是您想要做的,只需更改返回类型并
return matrix*axis;
。如果您想创建一个围绕
轴旋转的矩阵,请参见,例如。我同意,但由于我是opengl新手,因此我希望在不使用glm API的情况下实际实现旋转逻辑。我还尝试了返回(matrix*axis);但我仍然得到错误无法从'glm::detail::tvec3'转换为'const glm::detail::tvec3',我同意,但因为我是opengl新手,所以我想在不使用glm API的情况下实际实现旋转逻辑。我还尝试了返回(矩阵*轴);但我仍然得到错误无法从'glm::detail::tvec3'转换为'const glm::detail::tmat3x3'