Ошибки реализации ротации

Я пытаюсь реализовать вращение для камеры с помощью следующей функции

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 дает ошибки компиляции

2 ответа

В операторе return вы умножаете матрицу 4x4 на 4-мерный вектор.

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 (m4 * vec4(axis,1));, что приведет к vec4 (Матрица 4x1), что, вероятно, является причиной того, что вы получаете эту ошибку компиляции.

Если вы хотите повернуть вектор, вам не нужно использовать матрицу 4x4, вы можете просто умножить mat3 посредством vec3 вы хотите повернуть, что приведет к vec3 представляющий повернутый вектор.

Другие вопросы по тегам