3d渲染之坐标变换
0x00 坐标系基础
首先3d坐标系中xyz,x是水平的,y是垂直的,z是从屏幕向里外的。这里分为左手坐标系和右手坐标系。x都是向右为正,y是向上为正
而左手坐标系z向屏幕里为正, 右手坐标系向外为正,directx9中使用左手坐标系
3d图形学中使用4维向量表示坐标,四维方阵*向量表示坐标的变换,第四个分量带来了很多好处,比较抽象。
顶点的几种变换,平移、旋转、缩放,都能用向量与矩阵表示。
0x01 图形学中的坐标系
有局部坐标系,用于建立模型用的,模型的中心即是坐标系中心,一个模型指的是以局部坐标系的各个顶点
世界坐标系,将模型放入世界时,我们需要将模型的顶点的局部坐标系转换成放置后的世界坐标系。这种转换其实本质上是对模型的一系列变换,如先放到某个位置,也就是平移,再旋转方向,也就是旋转。 将这三种变换的矩阵相乘在一起(注意乘的顺序),就是局部坐标系到世界坐标系的变换矩阵。
局部坐标系到世界坐标系的变换的过程,也就是我们把模型放置到世界里的过程,这个在directx中的表示为。依次设置各种变换,得到最后的矩阵,然后再使用setTransform(world, &matrix) 告诉directx后面的模型渲染时,将每个顶点都这样从模型的局部坐标转换到世界坐标,也就是如何放置后面的模型。
摄影坐标系,摄影坐标是以摄影机为中心,根据其所对着的方向和上方,建立的坐标系。其实摄影坐标系和局部坐标系一样,都是以某一个物体为中心。我们为了渲染能够看见的物体,必须知道其他物体在摄影坐标系里的坐标。因此又需要将世界坐标系转换成摄影坐标系。这个转换矩阵很容易算出来,他是从摄影坐标系转换成实际坐标系的转换矩阵的逆矩阵。这M射->世 这个矩阵本质就是放置摄像机到世界时的转换矩阵。(因为我们说过 摄影坐标系和局部坐标系是一样的)
视椎体投影坐标系, 建立摄影机坐标系后,我们根据视椎体,再建立一个非正交坐标系,投影坐标系,这个坐标系使得近大远小成为可能。这个坐标系是从摄影坐标系的基础上建立的。 我们将屏幕投影坐标系的去掉,就得到了屏幕上的投影。
0x02 directx中的变换函数
也就是,如果我们要渲染一个物体,我们需要设置一个该物体的M局->世 M世->射 M射->屏
要注意的是不同物体在世界位置不一样,因此不同物体需要有不同的M局->世, 改变在世界里的位置,就要改变M局->世
同样的,可以有多个不同的摄像机和屏幕,每次改变摄像机的位置,都需要改变M世->射,每次改变视椎体都要改变M射->视
directx中,对于三种矩阵的变换都提供了支持。
首先,如何从局部坐标系转换到世界坐标系,这个矩阵就是你调用平移 旋转 缩放这三个函数将物体放到世界的过程中,最终得到的矩阵,最后调用setTransform(World, &M) 设置这个转换矩阵 、
另外两种就得调用对应的方法,给定摄影机和视椎体的参数,得到转换矩阵,再设置。