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

World position pointed by view camera vector

我已经根据来自 this 的向上、向右和视图矢量实现了 fps 相机。

现在我希望能够通过以 minecraft 风格放置立方体来与世界互动。

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

我计算了我提到的网络中的每个矢量(例如 lookAt = camera_position + view_direction)但是绘制的立方体总是围绕着我。我已经尝试了几种方法,比如实际放置它(四舍五入 lookAt),它出现在想要的位置附近,但不在我正在看的地方。

给定这些向量,我如何绘制以我的相机正在观察的位置为中心但稍微远一点(完全像我的世界)?

没有图像很难判断,但 lookAt 很可能是您的标准化前向向量?如果我理解正确的话,你会想要做一些类似 objectpos = camerapos + forward * 10f 的事情(其中 10f 是你想要以 3d space 为单位将物体放置在你面前的距离)以确保它被放置fps 控制器前面的几个单元。

实际上,如果 view_direction 是您的标准化前向矢量并且您的 lookAt 是 camera_pos + view_direction,那么您最终会得到非常接近您的相机位置的东西,这会解释为什么立方体会在你体内产生。不管怎样,我的建议应该仍然有效:)

but the cube drawn is always arround me.

是的,这很明显。您将立方体放置在半径为 view_direction 且中心位于 camera_position.

的球面上

Given these vectors, how can I draw that's centered at the position that my camera is looking but a little bit further (exactly like minecraft)?

您需要将立方体放置在 view 矢量与场景几何体的交点处。在最简单的情况下,它可以只是 "ground" 平面,所以你需要 intersect view 向量和 "ground" 平面。然后,您需要将交点 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);