本文主要是介绍图形流水账0:模型坐标与NDC的相互转化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
模型坐标转换到NDC
1.模型坐标到世界坐标
2.世界坐标到观察坐标
3.观察坐标到裁剪坐标
4.裁剪坐标透视除法转换为NDC(归一化设备坐标)
透视投影
其中:
nearClipPlaneHeight = 2 * Near(摄像机到近裁剪平面的距离)*tan(FOV/2)
farClipPlaneHeight = 2 * Far(摄像机到远裁剪平面的距离)tan(FOV/2)
Aspect = nearClipPlaneWidth/nearClipPlaneHeight = farClipPlaneWidth/farClipPlaneHeight
设当前物体所在观察坐标坐标为V(x,y,-z)则此时所在
视椎体平面的高度:height = (-z)tan(FOV/2)
视椎体平面的宽度:width = Aspect * height = Aspect * (-z)tan(FOV/2)
则当:
-height < y < height => z < y * cot(FOV/2) < -z
-width < x < width => z <( x * cot(FOV/2))/Aspect < -z
near < z < far => z < -z(Far + Near)/(Far - Near) - 2NearFar/(Far - Near) < -z
以上成立的物体不会被裁剪,则此时的裁剪矩阵为
正交投影
同理可得
此时裁剪坐标P = Mf * V = (x,y,z,V.z)
透视除法
NDC = (x/V.z,y/V.z,z/V.z,1)
当已知NDC求观察坐标V时,设Mf的逆矩阵表示为Mf(逆)则由
T = Mf(逆) * NDC = 1/V.z{Mf(逆) * (x,y,z,1)} = 1/V.z * V
则此时可得T.w = 1/Vz,即V = T/(1/V.z) = T/T.w
参考书籍:Shader入门精要第四章
这篇关于图形流水账0:模型坐标与NDC的相互转化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!