视图相机矢量指向的世界位置
Posted
技术标签:
【中文标题】视图相机矢量指向的世界位置【英文标题】:World position pointed by view camera vector 【发布时间】:2019-05-13 14:09:23 【问题描述】:我已经实现了一个基于来自this 的上、右和视图向量的 fps 相机。
现在我希望能够通过以我的世界风格放置立方体来与世界互动。
我的lookAt向量是视图向量和相机位置的总和,所以我第一次尝试是在lookAt上绘制一个立方体,但这会导致奇怪的行为。
我计算我提到的网络中的每个向量(例如lookAt = camera_position + view_direction),但绘制的立方体总是围绕着我。我已经尝试了几件事,比如实际放置它(四舍五入),它出现在想要的位置附近,但不在我正在看的地方。
鉴于这些向量,我如何绘制以我的相机正在看的位置为中心但稍微远一点(完全像 minecraft)?
【问题讨论】:
我认为如果您发布渲染图像会更好。 【参考方案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);
【讨论】:
谢谢!这增加了功能的质量!【参考方案2】:如果没有要查看的图像就很难判断,但是 lookAt 很可能是您的标准化前向向量?如果我对你的理解正确,你会想要做类似objectpos = camerapos + forward * 10f
的事情(其中 10f 是你想以 3d 空间单位将物体放在你面前的距离),以确保它在前面放置几个单位你的 fps 控制器。
实际上,如果 view_direction 是您的标准化前向矢量,而您的 lookAt 是 camera_pos + view_direction,那么您最终会得到非常接近您的相机位置的东西,这可以解释为什么立方体会在您体内产生。无论哪种方式,我的建议应该仍然有效:)
【讨论】:
正是这样!我发誓我以前试过这个,但不知何故我做错了......非常感谢! @ero.rom 请考虑接受我的回答以便解决:)以上是关于视图相机矢量指向的世界位置的主要内容,如果未能解决你的问题,请参考以下文章
通过单击列表视图上的列表项更改 MapView Android Studio 上的位置相机视图