0

我正在尝试实现一个跟随移动物体的相机。我已经实现了这些功能:

void Camera::espheric_yaw(float degrees, glm::vec3 center_point)
{

    float lim_yaw = glm::radians(89.0f);
    float radians = glm::radians(degrees);
    absoluteYaw += radians;

    ... clamp absoluteYaw

    float radius = 10.0f;
    float camX = cos(absoluteYaw) * cos(absoluteRoll) * radius;
    float camY = sin(absoluteRoll)* radius;
    float camZ = sin(absoluteYaw) * cos(absoluteRoll) * radius;
    eyes.x = camX;
    eyes.y = camY;
    eyes.z = camZ;
    lookAt = center_point;
    view = glm::normalize(lookAt - eyes);
    up = glm::vec3(0, 1, 0);
    right = glm::normalize(glm::cross(view, up));

}

我想将此功能(和音高版本)用于跟随移动 3d 模型的相机。现在,它在 center_point 为 (0,1,0) 时有效。我认为我的位置正确,但向上向量显然并不总是(0,1,0)。

我怎样才能让我的相机起立、查看和正确的矢量?然后,如果我以这种方式更新相机的眼睛位置,当另一个对象(以 center_position 参数为中心)移动时,我的相机将如何移动?

这个想法是每次我用 centered_value = 移动对象的中心输入鼠标时更新它。然后将 gluLookAt 与我的相机的视图、眼睛和向上值一起使用(以及将是眼睛+视图的 lookAt)。

4

1 回答 1

0

跟随一个移动的物体就是将相机指向那个物体。这就是典型lookAt函数的作用。在这里查看数学,然后使用glm::lookAt().

“Arcball”技术用于随鼠标旋转。在这里查看一些数学。

这个想法是从屏幕上的位置获取两个向量(第一个,第二个)。对于每个向量,X,Y取值取决于鼠标“移动”的像素和窗口的大小。Z由“轨迹球”数学计算得出。使用这两个向量(在归一化之后),它的叉积给出了相机坐标中的旋转轴,它的点积给出了角度。现在,您可以通过以下方式旋转相机glm::rotate()

如果你走另一条路线(例如自己计算相机矩阵),那么相机的“向上”方向必须自己更新。请记住,它垂直于相机的其他两个轴。

于 2019-05-15T22:59:01.697 回答