zoukankan      html  css  js  c++  java
  • 透视校正插值

    在投影变换视口变换后,需要对投影到屏幕上的平面三角形顶点属性进行线性插值,例如颜色,纹理,深度等。但对于投影前在3D空间的三角形来说,这个插值并不是线性的。下面来推导一下这个插值。

    假设屏幕空间的三角形的三个顶点分别为(v_0,v_1,v_2)(v_p)是位于三角形一边上的点(v_0 + t(v_1 - v_0))

    那么有:

    [x_p = x_0 + t(x_1 - x_0) ]

    其中,$ 0 leq t leq 1$。对于投影前的三角形,根据投影变换则有:

    [dfrac{x'}{x} = dfrac{z'}{d} ]

    其中,(x',z')为投影前三角形的坐标,(d)为到投影平面的距离。代入可得:

    [dfrac{x'_p}{z'_p} = dfrac{x'_0}{z'_0} + t(dfrac{x'_1}{z'_1} - dfrac{x'_0}{z'_0}) ]

    另外,我们已知(v'_0,v'_1,v'_p)三点共线,假设直线方程为(ax'+bz'=c),代入化简可得到:

    [dfrac{1}{z'_p} = dfrac{1}{z'_0} + t(dfrac{1}{z'_1} - dfrac{1}{z'_0}) ]

    可见,对于投影前在3D空间的三角形来说,(z)的倒数成线性插值。这样,我们就可以根据屏幕空间三角形的顶点深度,插值计算出三角形内任意点的深度值。

    同样地,对于其他属性(m')例如颜色纹理等,它们都关于深度(z')成线性关系,即都有(am'+bz'=c)。等式两边都除以(cz')得到:

    [dfrac{am'}{cz'} + dfrac{b}{c} = dfrac{1}{z'} ]

    根据之前求得的结果,有:

    [dfrac{am'_p}{cz'_p} + dfrac{b}{c} = dfrac{am'_0}{cz'_0} + dfrac{b}{c} + t(dfrac{am'_1}{cz'_1} - dfrac{am'_0}{cz'_0}) ]

    化简得到:

    [dfrac{m'_p}{z'_p} = dfrac{m'_0}{z'_0} + t(dfrac{m'_1}{z'_1} - dfrac{m'_0}{z'_0}) ]

    可见,对于投影前在3D空间的三角形来说,其他属性乘以(z)的倒数成线性插值。这样,我们就可以根据屏幕空间三角形的顶点属性,插值计算出三角形内任意点的属性值。

  • 相关阅读:
    校园WebGIS开发与实践(论文部分)
    初来博客园,请多多关照
    MIFtoTAB and TABtoMIF(MIF和TAB互转小工具)
    MIFtoSHP通用转换工具
    activity 对home 按钮事件的处理
    在XML布局文件里,会遇到的一些单位
    自己写的Adapter 无法被鼠标点中问题
    linux 下查看文件修改时间 等
    Android中使用GridView分页显示系统所安装的应用,支持拖动与手势滑动
    getLaunchIntentForPackage 获取到的为null原因
  • 原文地址:https://www.cnblogs.com/back-to-the-past/p/12274314.html
Copyright © 2011-2022 走看看