Glm 函数的问题
Problems with Glm functions
为什么这段代码可以编译
[[nodiscard]] glm::mat4 rotationX(double theta)
{
return glm::rotate(glm::mat4(1.0), static_cast<float>(theta), glm::vec3(1.0, 0.0, 0.0));
}
而这个不是
[[nodiscard]] glm::mat4 rotationX(double theta)
{
return glm::rotate(glm::mat4(1.0), theta, glm::vec3(1.0, 0.0, 0.0));
}
它导致错误 C2672 no matching overloaded function found
并且
错误 C2782: Template parameter T is ambigous
。
theta 应该是什么类型?
还有这个代码
[[nodiscard]] glm::mat4 shearing(double xy, double xz, double yx, double yz, double zx, double zy)
{
auto sh = glm::mat4(1.0);
sh[1][0] = xy;
sh[2][0] = xz;
sh[2][1] = yz;
sh[0][1] = yx;
sh[0][2] = zx;
sh[1][2] = zy;
return sh;
}
产生以下警告:
warning C4244: 'argument' : conversion from 'double' to 'T', possible loss of data
我不明白到底是什么错误,因为其他一切似乎都有效。
PS,我包括
#include <glm/fwd.hpp>
在 .hpp 和
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
在 .cpp 中。
[[nodiscard]] glm::mat4 shearing(double xy, double xz, double yx, double yz, double zx, double zy)
{
auto sh = glm::mat4(1.0);
sh[1][0] = xy;
sh[2][0] = xz;
sh[2][1] = yz;
sh[0][1] = yx;
sh[0][2] = zx;
sh[1][2] = zy;
return sh;
}
当glm::rotate
与vec3
和mat4
一起使用时,theta
的类型必须是float,因为mat4
和[=的元素类型13=] 是 float
:
typedef mat<4, 4, f32, defaultp> mat4;
typedef vec<3, float, defaultp> vec3;
对应的双精度数据类型为damt4
和dvec3
:
typedef mat<4, 4, f64, defaultp> dmat4;
typedef vec<3, f64, defaultp> dvec3;
类型的名称与相应的 GLSL 数据类型相同 (Data Type (GLSL))。在 glsl 中,可以从任何基本数据类型构造矩阵和向量数据类型。
为什么这段代码可以编译
[[nodiscard]] glm::mat4 rotationX(double theta)
{
return glm::rotate(glm::mat4(1.0), static_cast<float>(theta), glm::vec3(1.0, 0.0, 0.0));
}
而这个不是
[[nodiscard]] glm::mat4 rotationX(double theta)
{
return glm::rotate(glm::mat4(1.0), theta, glm::vec3(1.0, 0.0, 0.0));
}
它导致错误 C2672 no matching overloaded function found
并且
错误 C2782: Template parameter T is ambigous
。
theta 应该是什么类型?
还有这个代码
[[nodiscard]] glm::mat4 shearing(double xy, double xz, double yx, double yz, double zx, double zy)
{
auto sh = glm::mat4(1.0);
sh[1][0] = xy;
sh[2][0] = xz;
sh[2][1] = yz;
sh[0][1] = yx;
sh[0][2] = zx;
sh[1][2] = zy;
return sh;
}
产生以下警告:
warning C4244: 'argument' : conversion from 'double' to 'T', possible loss of data
我不明白到底是什么错误,因为其他一切似乎都有效。
PS,我包括
#include <glm/fwd.hpp>
在 .hpp 和
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
在 .cpp 中。
[[nodiscard]] glm::mat4 shearing(double xy, double xz, double yx, double yz, double zx, double zy)
{
auto sh = glm::mat4(1.0);
sh[1][0] = xy;
sh[2][0] = xz;
sh[2][1] = yz;
sh[0][1] = yx;
sh[0][2] = zx;
sh[1][2] = zy;
return sh;
}
当glm::rotate
与vec3
和mat4
一起使用时,theta
的类型必须是float,因为mat4
和[=的元素类型13=] 是 float
:
typedef mat<4, 4, f32, defaultp> mat4; typedef vec<3, float, defaultp> vec3;
对应的双精度数据类型为damt4
和dvec3
:
typedef mat<4, 4, f64, defaultp> dmat4; typedef vec<3, f64, defaultp> dvec3;
类型的名称与相应的 GLSL 数据类型相同 (Data Type (GLSL))。在 glsl 中,可以从任何基本数据类型构造矩阵和向量数据类型。