Я работаю над сценарием, который включает в себя некоторые конические сетки, которые должны использоваться в качестве точечных огней в отложенном рендерере. Мне нужно масштабировать, вращать и переводить эти конусные сетки, чтобы они указывали в правильном направлении. По словам одного из моих преподавателей я могу вращать конусы для выравнивания с вектором направления и переместить их в правильное положение путем умножения его модели матрицы с матрицей, возвращенного этим,Как повернуть объект с помощью glm :: lookAt()?
glm::inverse(glm::lookAt(spot_light_direction, spot_light_position, up));
однако это не кажется, работают, и это приводит к тому, что все конусы будут помещены в мировое происхождение. Если я затем переводит конусы вручную, используя другую матрицу, кажется, что конусы даже не направлены в правильном направлении.
Есть ли лучший способ повернуть объекты так, чтобы они находились в определенном направлении?
Вот мой текущий код, который запускается на выполнение для каждого конуса,
//Move the cone to the correct place
glm::mat4 model = glm::mat4(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
spot_light_position.x, spot_light_position.y, spot_light_position.z, 1);
// Calculate rotation matrix
model *= glm::inverse(glm::lookAt(spot_light_direction, spot_light_position, up));
float missing_angle = 180 - (spot_light_angle/2 + 90);
float scale = (spot_light_range * sin(missing_angle))/sin(spot_light_angle/2);
// Scale the cone to the correct dimensions
model *= glm::mat4(scale, 0, 0, 0,
0, scale, 0, 0,
0, 0, spot_light_range, 0,
0, 0, 0, 1);
// The origin of the cones is at the flat end, offset their position so that they rotate around the point.
model *= glm::mat4(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, -1, 1);
Я отметил это в комментариях, но я еще раз отметить, что конусы начало координат находится в центре плоского конца конус, я не знаю, если это имеет значение или нет, я просто подумал, что я его подниму.
'lookAt' уже включает в себя перевод. Вам не нужно это делать снова. То есть начинайте с 'model = glm :: inverse (glm :: lookAt (...' (не умножайтесь). –
@NicoSchertler Как я заявил в сообщении, если я не включаю перевод вручную, тогда модели будут помещены в мировое происхождение.Я делаю что-то еще неправильно? –
Вы перепутали параметры 'lookAt'. См. [документация] (https://glm.g-truc.net/0.9.2/api/a00245.html) Кроме того, я не уверен в порядке оставшихся матриц. –