gpt4 book ai didi

c++ - 由 View 相机 vector 指向的世界位置

转载 作者:行者123 更新时间:2023-11-28 04:18:04 24 4
gpt4 key购买 nike

我已经根据来自 this 的向上、向右和 View vector 实现了一个 fps 相机.

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

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

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

鉴于这些 vector ,我如何绘制以我的相机所注视的位置为中心但稍远一点的位置(就像我的世界一样)?

最佳答案

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 vector 与场景几何体的交点处。在最简单的情况下,它可以只是“地”平面,所以你需要 intersect view 带“地面”平面的 vector 。然后,您需要将交点 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);

关于c++ - 由 View 相机 vector 指向的世界位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56114141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com