由视图相机矢量指向的世界位置
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);
我已经根据来自 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);