透视投影仅给出视野

时间:2014-05-20 01:03:10

标签: algorithm opengl graphics 3d raytracing

我正在使用Perspective相机。构造函数必须是:

PerspectiveCamera::PerspectiveCamera(Vec3f &center, Vec3f &direction, Vec3f &up, float angle)

这种结构与大多数其他结构不同,因为它缺少近和远剪裁平面。我知道如何使用中心,方向和向上 - 标准的算法看法。

r

foo+bar

z

我们可以构建视图矩阵并相应地转换矩阵:

V

因此,观看转型是:

M

对于正交相机(对我来说正常工作),逆变换用于从屏幕空间到世界空间。相机坐标来自(-1,-1,0) - > (1,1,0)在屏幕空间中。

p

对于透视变换,仅给出视野。 Wikipedia 3D projection article使用视角提供透视投影矩阵,并假设摄像机坐标来自(-1,-1) - > (1,1):

p

p

在我的代码中,(例如,ey,ez)是来自(-1,-1,ez)的相机坐标 - > (1,1,ez)。请注意,K中的1(3,3)点并不在维基百科文章中 - 我将其放入以使矩阵可逆。所以这可能是个问题。

但无论如何,对于透视投影,我使用了这种转换:

p

K inverse与p相乘以使规范视图体积成为视锥体,并且其结果乘以M inverse以移动到世界坐标中。

我得到了错误的结果。正确的输出是:

Correct result

我的输出如下:

My result

根据我的约束(没有近距离和远距离平面输入),我是否使用正确的算法进行透视投影?

1 个答案:

答案 0 :(得分:0)

以防其他人遇到此问题,问题中提供的方法不是创建视锥体的正确方法。透视矩阵(K)用于将远平面投影到近平面上,在这种情况下我们没有这些平面

要创建平截头体,请对(x,y,ez)进行逆变换[与正交投影的(x,y,0)相反)。通过从投影中心减去变换点来找到新方向。拍摄光线。

相关问题