opengl 我如何才能得到一个glm透视投影的距离,将代表1像素在我的屏幕上?

bxpogfeg  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(156)

我有下面的glm透视投影

world.cameraProjection = glm::perspective(glm::radians(45.0f), app.aspectRatio, 0.0f, 100.0f);
world.cameraProjection = glm::scale(world.cameraProjection, world.scale);
world.cameraView = glm::translate(world.cameraProjection, world.camera);

我想猜一个值,我将不得不使用它来绘制一条具有像素完美宽度的线。
我知道我的屏幕宽度,现在我尝试将代表1个像素的视口百分比转换为glm cameraView的距离。因此,即使缩放改变了,我绘制的线在屏幕上的显示大小也总是相同的。
glm中有没有函数可以做到这一点?

mklgxw1f

mklgxw1f1#

使用透视投影时,表示一个像素的x和y距离取决于深度(z距离)。

归一化设备空间中的投影尺寸可以被变换为视图空间中的尺寸,其中:

aspect = width / height
tanFov = tan(fov_y / 2.0) * 2.0;

dist_x = ndc_dist_x * z_eye * tanFov * aspect;
dist_y = ndc_dist_y * z_eye * tanFov;

你想要的是:

height * (ndc_dist_y + 1) / 2 == 1

如果你知道一个物体的z距离,公式是:

dist = z_eye * (2.0 / height - 1.0) * tan(fov_y / 2.0) * 2.0

其中,fov_y是辐射视野,height是视野的高度,以像素为单位,z_eye是从物体到摄像机的绝对距离。
请考虑使用平行投影(Orthographic projection),其中投影的大小不取决于与相机的距离。

相关问题