弧球摄像头:如何获得正确的方向和向上

Arcball Camera: how to obtain right, direction and up

本文关键字:方向 摄像头 何获得      更新时间:2023-10-16

我正在尝试实现一个遵循移动对象的相机。我已经实施了这些功能:

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模型的相机。现在,当中心_point为(0,1,0(时,它起作用。我认为我的位置正确,但UP向量显然并不总是(0,1,0(。

如何为相机抬起,查看和正确的向量?然后,如果我以这种方式更新相机的眼睛位置,当另一个对象(以Center_position参数为中心(移动时,我的相机将如何移动?

这个想法是每次我使用centered_value =移动对象中心的鼠标输入时进行更新。然后将glulookat与视图,眼睛和我的相机的值(以及将是眼睛 视图的lookat(。

遵循移动对象之后是将相机指向该对象的问题。这就是典型的lookAt函数所做的。请参阅此处的数学,然后使用glm::lookAt()

"弧球"技术用于用鼠标旋转。在这里查看一些数学。

这个想法是从屏幕上的位置获得两个向量(第一,第二(。对于每个向量,X,Y都取决于鼠标"旅行"的像素和窗口的大小。Z通过"轨迹球"数学计算。使用这两个向量(在标准化之后(,其交叉产物在相机坐标中给出了旋转轴,其点产物给出了角度。现在,您可以通过glm::rotate()

旋转相机

如果您走另一个路线(例如,自己计算相机矩阵(,则必须自己更新相机的"向上"方向。请记住,它垂直于相机的其他两个轴。