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

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 请考虑接受我的回答以便解决:)

以上是关于视图相机矢量指向的世界位置的主要内容,如果未能解决你的问题,请参考以下文章

模型视图投影 - 如何在世界中移动对象

OpenGL边用边学------2 经典照相机模型

OpenGL边用边学------2 经典照相机模型

通过单击列表视图上的列表项更改 MapView Android Studio 上的位置相机视图

如何使用 react-native 将图像放在相机视图的顶部

是否可以通过 2d-3d 点关系获得图像或相机位置的正面平行视图?