我正在使用Perspective相机。构造函数必须是:
PerspectiveCamera::PerspectiveCamera(Vec3f ¢er, Vec3f &direction, Vec3f &up, float angle)
这种结构与大多数其他结构不同,因为它缺少近和远剪裁平面。我知道如何使用中心,方向和向上 - 标准的算法看法。
我们可以构建视图矩阵并相应地转换矩阵:
因此,观看转型是:
对于正交相机(对我来说正常工作),逆变换用于从屏幕空间到世界空间。相机坐标来自(-1,-1,0) - > (1,1,0)在屏幕空间中。
对于透视变换,仅给出视野。 Wikipedia 3D projection article使用视角提供透视投影矩阵,并假设摄像机坐标来自(-1,-1) - > (1,1):
在我的代码中,(例如,ey,ez)是来自(-1,-1,ez)的相机坐标 - > (1,1,ez)。请注意,K中的1(3,3)点并不在维基百科文章中 - 我将其放入以使矩阵可逆。所以这可能是个问题。
但无论如何,对于透视投影,我使用了这种转换:
K inverse与p相乘以使规范视图体积成为视锥体,并且其结果乘以M inverse以移动到世界坐标中。
我得到了错误的结果。正确的输出是:
我的输出如下:
根据我的约束(没有近距离和远距离平面输入),我是否使用正确的算法进行透视投影?
答案 0 :(得分:0)
以防其他人遇到此问题,问题中提供的方法不是创建视锥体的正确方法。透视矩阵(K)用于将远平面投影到近平面上,在这种情况下我们没有这些平面
要创建平截头体,请对(x,y,ez)进行逆变换[与正交投影的(x,y,0)相反)。通过从投影中心减去变换点来找到新方向。拍摄光线。