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'