世界位置所指向的视图相机矢量

时间:2019-05-13 14:09:24

标签: c++ opengl camera glm-math

我已经基于this的上,右和观看矢量实现了fps摄像机。

现在,我希望能够通过将方块放置为Minecraft样式来与世界互动。

我的lookAt向量是视图向量和相机位置的总和,所以我的第一次尝试是在lookAt上绘制一个立方体,但这会引起奇怪的行为。

我像我提到的网络中那样计算每个向量(lookAt = camera_position + view_direction),但是绘制的立方体始终围绕着我。我已经尝试了几种方法,例如将其实际放置(围绕lookAt),它显示在想要的位置附近,而不是我正在查看的位置。

鉴于这些矢量,我如何绘制以我的相机看起来略远一点(就像我的世界一样)的位置为中心?

2 个答案:

答案 0 :(得分:1)

  

但是绘制的立方体总是围绕着我。

是的,这很明显。您将立方体放置在半径为view_direction的球面上,中心为camera_position

  

鉴于这些向量,我如何绘制以该位置为中心的图像   我的相机看起来更远了(就像   《我的世界》吗?

您需要将立方体放置在view向量与场景几何图形的交点处。在最简单的情况下,它只能是“地”平面,因此您需要intersect view向量和“地”平面。然后,您需要将交点xyz的坐标四舍五入到最近的网格节点xyz = round(xyz / cubexyz)*cubexyz,其中cubexyz-立方体大小。

近似代码:

Vector3D intersectPoint(Vector3D rayVector, Vector3D rayPoint, Vector3D planeNormal, Vector3D planePoint) {
    Vector3D diff = rayPoint - planePoint;
    double prod1 = diff.dot(planeNormal);
    double prod2 = rayVector.dot(planeNormal);
    double prod3 = prod1 / prod2;
    return rayPoint - rayVector * prod3;
}

.......
Vector3D cubePos = intersectPoint(view_direction, camera_position, Vector3D(0, 1, 0), Vector3D(0, 0, 0));
cubePos = round(cubePos / cubeSize) * cubeSize;
AddCube(cubePos);

答案 1 :(得分:0)

不看图像就很难分辨,但是lookAt最有可能是您的标准化前向矢量?如果我正确理解了您的意思,则可以执行类似objectpos = camerapos + forward * 10f的操作(其中10f是您要以3d空间单位将对象放置在您面前的距离),以确保将其放置在fps控制器的前端。

实际上,如果view_direction是归一化的正向向量,而lookAt是camera_pos + view_direction,则最终会得到非常接近相机位置的东西,这将解释为什么立方体在您体内生成。无论哪种方式,我的建议仍然应该有效:)