我已经基于this的上,右和观看矢量实现了fps摄像机。
现在,我希望能够通过将方块放置为Minecraft样式来与世界互动。
我的lookAt向量是视图向量和相机位置的总和,所以我的第一次尝试是在lookAt上绘制一个立方体,但这会引起奇怪的行为。
我像我提到的网络中那样计算每个向量(lookAt = camera_position + view_direction),但是绘制的立方体始终围绕着我。我已经尝试了几种方法,例如将其实际放置(围绕lookAt),它显示在想要的位置附近,而不是我正在查看的位置。
鉴于这些矢量,我如何绘制以我的相机看起来略远一点(就像我的世界一样)的位置为中心?
答案 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,则最终会得到非常接近相机位置的东西,这将解释为什么立方体在您体内生成。无论哪种方式,我的建议仍然应该有效:)