Проблемы с функциями Glm

#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;
}