Почему компилируется этот код

    [[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> 

В .hpp и

#include <glm/glm.hpp>  
#include <glm/gtc/matrix_transform.hpp>

В .cpp.

1
a a 17 Сен 2021 в 15:57

2 ответа

Лучший ответ

При использовании glm::rotate с vec3 и mat4, тип theta должен быть float, потому что тип элемента 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
Rabbid76 17 Сен 2021 в 13:14
[[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;
}
0
user438383 17 Сен 2021 в 13:52