GLM сделать матрицу вращения от vec3

Я делаю игру, и мне нужен снаряд, чтобы понять, в каком направлении он движется. Я знаю, в каком направлении он движется, и мне нужно создать матрицу преобразования, которая позволила бы мне выровнять направление модели снаряда (1, 0, 0) или положительную ось X по любому произвольному вектору. Как я мог сделать это в GLM?

1

Решение

Эй, я понял ответ, который был близок к @Mr_Pouet, но вот он:

const glm::vec3 a = ...;
const glm::vec3 b = ...; // in my case (1, 0, 0)
glm::vec3 v = glm::cross(b, a);
float angle = acos(glm::dot(b, a) / (glm::length(b) * glm::length(a)));
glm::mat4 rotmat = glm::rotate(angle, v);

Вы можете заменить a или b на что угодно, где a — вектор, который вы хотите перевести, а b — где вы находитесь. Мы можем оптимизировать это, если b равно (1, 0, 0) или оси X, как в моем случае:

glm::vec3 v = glm::vec3(0, -a.z, a.y);
float angle = acos(a.x / glm::length(a));
glm::mat4 rotmat = glm::rotate(angle, v);

Я надеюсь, что это помогает кому-то!

2

Другие решения

Что вы используете, чтобы точно представить направление?

Вы могли бы сделать что-то вроде этого:

glm::mat4 transform = glm::eulerAngleYXZ(euler.y, euler.x, euler.z);

Или через кватернионы:

glm::quat rot = glm::angleAxis(glm::radians(angle_in_degrees), glm::vec3(x, y, z));
glm::mat4 rotMatrix = glm::mat4_cast(rot);

Если вы не искали что-то простое, как glm::lookAt ?

detail::tmat4x4<T> glm::gtc::matrix_transform::lookAt
(
detail::tvec3< T > const &  eye,     // from
detail::tvec3< T > const &  center,  // to
detail::tvec3< T > const &  up       // up
)
1