gpt4 book ai didi

android - 计算 PerspectiveCamera 的视锥体 FOV

转载 作者:搜寻专家 更新时间:2023-11-01 09:32:10 24 4
gpt4 key购买 nike

我目前有一个由两个区域组成的屏幕:

(值只是这个特定示例的假定值,当然可能因屏幕而异)。

屏幕总尺寸为 1080x1432 像素(宽 x 高),由两个区域组成,每个区域都使用 glViewPort 进行裁剪。这是因为我希望区域 (1) 在缩放时不要填满屏幕。

  1. 游戏区。可以缩放。尺寸为 1080x1277 像素(宽 x 高),位于顶部。
  2. HUD(仅供引用,此处的对象可以移动到区域 (1)。不可缩放。大小为 1080x154(宽x高)。

两者都有自己的相机。

区域(1)宽15f,高15f以上(15f以上无所谓)

我希望区域 (2) 的宽度为 7f,高度为 1f(为方便起见)。因此我想相应地设置相机。我试图通过计算 FOV 来做到这一点:

float size = 1f;
float halfHeight = size * 0.5f;
halfHeight *= (float) 154 / (float) 1080;
float fullHeight = 2 * halfHeight;
float halfFovRadians = MathUtils.degreesToRadians * camera.fieldOfView * 0.5f;
float distance = halfHeight / (float) Math.tan(halfFovRadians);

camera.viewportWidth = 1080;
camera.viewportHeight = 154;
camera.position.set(0f, 0, distance);
camera.lookAt(0, 0, 0);
camera.update();

然后我创建了一个对象:

ModelBuilder builder = new ModelBuilder();
builder.begin();
builder.node();
MeshPartBuilder meshBuilder = builder.part("lattice", GL20.GL_TRIANGLES,
VertexAttributes.Usage.Position,
new Material(ColorAttribute.createDiffuse(Color.GRAY)));

BoxShapeBuilder.build(meshBuilder, 0f, 0f, 0f, 7f, 1f, 0f);
Model model = builder.end();
mHudModel = new ModelInstance(model);

如果我手动尝试将距离设置为 1f,我仍然可以查看框,但如果低于 1.0f,框将不会显示。计算的距离约为 0.76f。

我正在尝试使用与 https://xoppa.github.io/blog/a-simple-card-game/ 相同的概念计算 FOV。它适用于区域 (1)。

我不能这样使用相机吗?我是否错误地计算了 FOV?为什么我的物体在距离低于 1f 时会消失?

谢谢。

最佳答案

投影矩阵描述了从场景的 3D 点到视口(viewport)的 2D 点的映射。它从眼睛空间转换到剪辑空间,剪辑空间中的坐标通过除以w转换为归一化设备坐标(NDC)。剪辑坐标的组成部分。 NDC 的范围为 (-1,-1,-1) 到 (1,1,1)。
超出 NDC 的每个几何体都将被剪裁。

enter image description here

相机平截头体的近平面和远平面之间的物体被映射到NDC的范围(-1, 1)。
(进一步参见 How to render depth linearly in modern OpenGL with gl_FragCoord.z in fragment shader?)

这意味着如果您想看到1.0更近的物体,那么您必须将到近平面的距离设置为小于1.0.

请注意,近平面和远平面应尽可能靠近场景,以提高计算精度并避免 z-fighting,但它们必须包括您希望从场景中看到的所有内容

关于android - 计算 PerspectiveCamera 的视锥体 FOV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46164180/

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