Arcball Camera:如何获取正确的方向和向上

时间:2019-05-15 22:07:25

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

我正在尝试实现一个跟随移动物体的摄像机。我已经实现了以下功能:

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将是眼+视线)。

1 个答案:

答案 0 :(得分:0)

跟随移动的对象就是将相机对准该对象的问题。这就是典型的void main() async { ProductNetwork productNetwork = ProductNetwork(); var data = await productNetwork.fetchProduct(); print(data.toString()); } class ProductNetwork { List<Product> allProducts = List<Product>(); Future<List<Product>> fetchProduct() async { int productId = 0; String url = 'http://example.com/api/Product/GetProduct?id=${productId.toString()}'; final http.Response response = await http.get(url); if (response.statusCode == 200) await allProducts.add((Product.fromJson(json.decode(response.body)))); else throw Exception('Failed. Status Code: ${response.statusCode}'); return allProducts; } } 函数的作用。参见数学here,然后使用lookAt

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

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

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