#c #glm-math
Вопрос:
Почему этот код компилируется
[[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
.
каким типом должна быть тета?
Также этот код
[[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>
в. ГЭС и
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
в. cpp.
Ответ №1:
При использовании glm::rotate
с vec3
и mat4
тип элемента theta
должен быть плавающим , поскольку тип элемента mat4
и vec3
является 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 (Тип данных (GLSL)). В glsl матричные и векторные типы данных могут быть построены из любого базового типа данных.
Ответ №2:
[[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;
}