一般我们设置视图矩阵就按照下面的方法设置
D3DXMATRIX matView; //定义一个矩阵
D3DXVECTOR3 vEye(0.0f, 20.0f, -30.0f); //摄像机的位置
D3DXVECTOR3 vAt(0.0f, 10.0f, 0.0f); //观察点的位置
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);//向上的向量,表示3D坐标系中向上的坐标向量,这里表示屏幕由底向上递增的向上,这是一个规范化的坐标系
D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp); //计算出取景变换矩阵
接下来我们进行拆解分析:
D3DXMatrixLookAtLH
zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)
xaxis.x yaxis.x zaxis.x 0
xaxis.y yaxis.y zaxis.y 0
xaxis.z yaxis.z zaxis.z 0
-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) 1
这是SDK中对D3DXMatrixLookAtLH的描述,我们来看看具体原因吧,并且以实际代码给出实际图解,
D3DXVECTOR3 定义的变量值既可以表示位置也可以表示分量,看定义的实际用途
//1.通过At和Eye两个点,计算出向量AtSubEye
//2.向量是一种表示大小,方向的一种数据,和位置无关
//3.vAt-vEye 这里的vAt,vEye是两个点(与位置相关,我们定义给出的),通过这两个点计算出向量,
// 这个向量是以vEye为基准点(向量的起始位置),计算出的向量,如图:
D3DXVECTOR3 vAtSubEye=vAt-vEye;
//全部转换为小数表示,规范化
D3DXVec3Normalize(&zaxis,&vAtSubEye);
D3DXVECTOR3 xaxis;
D3DXVECTOR3 crossUpZaxis;
D3DXVec3Cross(&crossUpZaxis,&vUp,&zaxis);//叉乘,求出,向上与Z轴的垂直向量
D3DXVec3Normalize(&xaxis,&crossUpZaxis);//X轴最后算法
//通过Z轴与X轴两个向量的叉乘就可以计算出Y轴的向量了
//由于Z轴和X轴两个向量已经规范化了,所以Y轴的的结果也是规范化的结果
D3DXVECTOR3 yaxis;
D3DXVec3Cross(&yaxis,&zaxis,&xaxis);//算Y轴的向量
//X,Y,Z三个轴的向量都计算出,此时我们需要计算出以vEye为原点的X,Y,Z在矩阵对应的坐标值
//通过X,Y,Z分别进行点乘则可以求出
float dot1=-D3DXVec3Dot(&xaxis,&vEye);//以vEye为原点的基准向量,求出与X轴的距离,以此距离值为矩阵的最后一组的X坐标
float dot2=-D3DXVec3Dot(&yaxis,&vEye);//以vEye为原点的基准向量,求出与Y轴的距离,以此距离值为矩阵的最后一组的Y坐标
float dot3=-D3DXVec3Dot(&zaxis,&vEye);//以vEye为原点的基准向量,求出与Z轴的距离,以此距离值为矩阵的最后一组的Z坐标
最后转换为矩阵
//转化为矩阵(加速运算)
D3DXMATRIX matViewMy;
matViewMy._11=xaxis.x;
matViewMy._12=yaxis.x;
matViewMy._13=zaxis.x;
matViewMy._14=0.0f;//这里设置为0表示,向量的意思
matViewMy._21=xaxis.y;
matViewMy._22=yaxis.y;
matViewMy._23=zaxis.y;
matViewMy._24=0.0f;//这里设置为0表示,向量的意思
matViewMy._31=xaxis.z;
matViewMy._32=yaxis.z;
matViewMy._33=zaxis.z;
matViewMy._34=0.0f;//这里设置为0表示,向量的意思
matViewMy._41=dot1;
matViewMy._42=dot2;
matViewMy._43=dot3;
matViewMy._44=1.0f;//这里表示是1,那么说这一个是表示为点(位置)
D3DXMatrixLookAtLH 最后算出的矩阵是需要表示如下图的效果:
总结:
D3DXMatrixLookAtLH,是一个根据Eye的位置以Target位置为方向,并且根据up位置算出
相机视图的矩阵(或者理解相机的本地矩阵)。
具体一点就是根据Eye的位置为原点计算出X,Y,Z轴,并且是具有方向性的矩阵。
为什么最后要生成矩阵?
答:矩阵在计算时候方便快捷,如果使用点的话,每个点都需要通过三角函数或者数学公式
进行计算然后融合,而矩阵不需要。