透视校正插值(Perspective-Correct Interpolation)

在渲染器光栅化每个三角形的过程中,需要对根据顶点属性对三角形进行扫描线插值。此时由于投影面上顶点的2D坐标与顶点属性不成线性关系,因此是不能简单地使用线性插值来计算顶点属性的。

此时应当利用透视校正插值(Perspective-Correct Interpolation)来计算。

设3D空间中存在一条线段,它的两个端点为A和B,3D坐标分别为(x1,y1,z1)和(x2,y2,z2)。这两点投影到camera坐标系投影面的两点为a(p1,q1)、b(p2,q2)。那么:

设该线段之间存在一个三维点C(投影到2D平面时我们用小写c表示),它的三维和二维坐标分别为(x3,y3,z3)、(p3,q3),

c=(1-t)a+tb。则可以证明

1/z3=(1-t)*(1/z1)+t*(1/z2) (1)

因为在网格模型中顶点属性与顶点的坐标值成线性关系,因此可以利用求出的z值来计算相应的顶点属性。

举个例子,假设我们已知3D空间的两个端点A和B,要求出该线段投影到视平面上2D线段的中点所对应的3D坐标。可以先利用公式(1)推导出该点的z坐标(t已知为1/2),

然后接下来有两种方法:

1、计算t1=(z3-z1)/(z2-z1),然后可以得到x3=t1*(x2-x1)+x1,y3以此类推。

2、根据x3/z3=t*x2/z2+(1-t)*x1/z1得到x3,y3同理。

这两种方法经我推导证明得到的结果是一样的。

具体的推导可以件这两篇博客:

http://blog.csdn.net/popy007/article/details/5556639

http://blog.csdn.net/popy007/article/details/5570803

上一篇:mysql时间字段转换为毫秒格式


下一篇:Java 将数据写入磁盘并读取磁盘上的文件