视锥就是场景中的一个三维空间,它的位置由视口的摄像机来决定。这个空间的形状决定了摄像机空间中的模型将被如何投影到屏幕上。透视投影是最常用的一种投影类型,使用这种投影,会使近处的对象看起来比远处的大一些。对于透视投影,视锥可以被初始化成金字塔形,将摄像机放在顶端。这个金字塔再经过前、后两个剪切面的分割,位于这两个面之间的部分就是视锥。只有位于视锥内的对象才可见。
视锥由凹视野(
![投影矩阵详解[转来的] - 四叶草 - 四叶草的博客 pic47.gif (3047 bytes)](https://i-blog.csdnimg.cn/blog_migrate/3275de43b595e59360499c33f24d3deb.gif)
在上图中,变量 投影矩阵是一个典型的缩放和透视矩阵。投影变换将视锥变换成一个直平行六面体的形状。因为视锥的近处比远处小,这样就会对靠近摄像机的对象起到放大的作用,也就将透视应用到了场景当中。 在视锥中,摄像机与空间原点间的距离被定义为变量 视矩阵将摄像机放置在场景的原点。又因为投影矩阵需要将摄像机放在 将两个矩阵相乘,得到下面的矩阵: 下图显示了透视变换如何将一个视锥变换成一个新的坐标空间。注意:锥形体变成了直平行六面体,原点从场景的右上角移到了中心。 在透视变换中, 这个矩阵基于一定的距离(这个距离是从摄像机到邻近的剪切面)对对象进行平移和旋转,但是它没有考虑到视野( 在这个矩阵中, 在程序中,使用视野角度来定义 在这些公式中,Zn表示邻近的剪切面的位置,变量Vw和Vh表示视口的高和宽。这两个参数与D3DVIEWPORT2结构中的dwWidth和dwHeight成员相关。 不管你使用那个公式,将 同世界和视变换一样,可以调用 下面的 D3DMATRIX ProjectionMatrix(const float near_plane,// distance to near clipping plane 一旦创建完了矩阵,你需要调用 一个顶点经过世界、观察和投影变换之后, 下图展示了一个不适合的投影矩阵,和一个经过缩放的适合的矩阵: 在前面的矩阵中,所有的变量都被假定为非零。有关雾化的内容见“目相关对基于
![投影矩阵详解[转来的] - 四叶草 - 四叶草的博客 pic49.gif (1138 bytes)](https://i-blog.csdnimg.cn/blog_migrate/28e03f96f10f3ed1270c7abff147632c.gif)
![投影矩阵详解[转来的] - 四叶草 - 四叶草的博客 pic50.gif (1178 bytes)](https://i-blog.csdnimg.cn/blog_migrate/59a38a0cbd6751c0ea7f3ed2d047e687.gif)
![投影矩阵详解[转来的] - 四叶草 - 四叶草的博客 pic51.gif (4974 bytes)](https://i-blog.csdnimg.cn/blog_migrate/9eae0dfebd911d3652f169e4f761d889.gif)
![投影矩阵详解[转来的] - 四叶草 - 四叶草的博客 pic52.gif (1681 bytes)](https://i-blog.csdnimg.cn/blog_migrate/27e7df30419c7c9b940a68ebfb8e4496.gif)
![投影矩阵详解[转来的] - 四叶草 - 四叶草的博客 pic53.gif (2085 bytes)](https://i-blog.csdnimg.cn/blog_migrate/e4ff0ee2799e71b8689e9a95a41ec0cf.gif)
![投影矩阵详解[转来的] - 四叶草 - 四叶草的博客 pic54.gif (871 bytes)](https://i-blog.csdnimg.cn/blog_migrate/2d16543d3f6304799d0bc21df5a4a723.gif)
const float far_plane,// distance to far clipping plane
const float fov_horiz,// horizontal field of view angle, in radians
const float fov_vert)// vertical field of view angle, in radians
{
float h, w, Q;
w = (float)cot(fov_horiz*0.5);
h = (float)cot(fov_vert*0.5);
Q = far_plane/(far_plane - near_plane);
D3DMATRIX ret = ZeroMatrix();
ret(0, 0) = w;
ret(1, 1) = h;
ret(2, 2) = Q;
ret(3, 2) = -Q*near_plane;
ret(2, 3) = 1;
return ret;
} // end of ProjectionMatrix()![投影矩阵详解[转来的] - 四叶草 - 四叶草的博客 pic55.gif (4266 bytes)](https://i-blog.csdnimg.cn/blog_migrate/906794af357f672bc7ca0236174b115c.gif)
本文深入探讨了三维场景中的视锥概念及其在透视投影中的应用。解释了如何通过摄像机位置确定视锥形状,以及如何使用投影矩阵实现对象从三维空间到屏幕的映射。此外,还介绍了创建适合深度缓冲和雾化效果的投影矩阵的方法。
6437

被折叠的 条评论
为什么被折叠?



