自己的透视投影坐标变换(perspective projection)的推导过程理解

    以前对于投影变化部分都是直接填参数使用API获取投影矩阵,没有深入的去理解其中的原理,而最近的3D图形编程学习到了有关“拾取”和“视截体剔除(frustum culling)”的部分,需要逆向推导,在网上找代码copy下来运行成功后需要去理解源代码。dx的doc一直看总觉得写的很烂,而网上一堆关于投影变换的文章都讲的不是很含糊就是太罗嗦太难理解(至少对我来说是这样),以下是自己的一些理解,至少觉得看上去简单一点,提供给大家参考。


    首先,我从最终结果开始讨论,我们最终是需要将视截体中3D空间的坐标P(x, y, z)转换为投影坐标Pp(Xp, Yp, Zp),其中-1≤Xp, Yp, Zp≤1,如下图(YZ平面):

自己的透视投影坐标变换(perspective projection)的推导过程理解_第1张图片

    这里要理解一点,AB是最终的投影平面,则|AO'| = |O'B| = 1,最终是需要求出的是Pp坐标中的Yp,就是要求Yp在O'A中所占的比例,则Xp也可同理求出。Zp的坐标的求法简单许多,后面介绍。Yp的求法如下图,最终求出来的Yp值就介于0和1之间:


就是1/2然后把3带入,就得到了最后的结果。同理可求出Xp。


下面求Zp,因为0≤Zp≤1,其实也就是要求出图中CE/DE的比值,这就简单了,CE/DE = (Z - Zn) / (Zf - Zn) ,其值最终也是介于0到1之间。

(X, Y, Z, 1), (未完待续 ... )




你可能感兴趣的:(自己的透视投影坐标变换(perspective projection)的推导过程理解)