【问题标题】:Arcball Camera: how to obtain right, direction and upArcball 相机:如何获得正确、方向和向上
【发布时间】:2019-10-03 03:00:26
【问题描述】:

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

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 与我的相机的 view、eyes 和 up 值一起使用(并且 lookAt 将是 eye+view)。

【问题讨论】:

    标签: c++ opengl camera glm-math arcball


    【解决方案1】:

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

    “Arcball”技术用于用鼠标旋转。看一些数学here

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多