2016-12-12 18 views
1

Я работаю над сценарием, который включает в себя некоторые конические сетки, которые должны использоваться в качестве точечных огней в отложенном рендерере. Мне нужно масштабировать, вращать и переводить эти конусные сетки, чтобы они указывали в правильном направлении. По словам одного из моих преподавателей я могу вращать конусы для выравнивания с вектором направления и переместить их в правильное положение путем умножения его модели матрицы с матрицей, возвращенного этим,Как повернуть объект с помощью 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); 

Я отметил это в комментариях, но я еще раз отметить, что конусы начало координат находится в центре плоского конца конус, я не знаю, если это имеет значение или нет, я просто подумал, что я его подниму.

+0

'lookAt' уже включает в себя перевод. Вам не нужно это делать снова. То есть начинайте с 'model = glm :: inverse (glm :: lookAt (...' (не умножайтесь). –

+0

@NicoSchertler Как я заявил в сообщении, если я не включаю перевод вручную, тогда модели будут помещены в мировое происхождение.Я делаю что-то еще неправильно? –

+0

Вы перепутали параметры 'lookAt'. См. [документация] (https://glm.g-truc.net/0.9.2/api/a00245.html) Кроме того, я не уверен в порядке оставшихся матриц. –

ответ

2

Ваш заказ матриц кажется правильным, но функция LookAt ожидает:

glm::mat4 lookAt (glm::vec3 eye, glm::vec3 center, glm::vec3 up) 

Здесь глаз расположение камеры, центр расположения объекта вы смотрите (в вашем случае, если у вас нет такого местоположения, вы можете использовать spot_light_direction + spot_light_position).

так просто изменить

glm::lookAt(spot_light_direction, spot_light_position, up) 

в

glm::lookAt(spot_light_position, spot_light_direction + spot_light_position, up) 
+0

Огромное вам спасибо! В этом была проблема, я предположил, что функция использовалась по-разному при ее использовании для этой цели, но я, вероятно, должен был подумать, чтобы попробовать это. –

 Смежные вопросы

  • Нет связанных вопросов^_^