如何使用 glm::lookAt() 旋转对象?

How to rotate an object using 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 函数需要:

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)