D3DXMatrixLookAtLH 函数详解

本文详细解析了D3DXMatrixLookAtLH函数的工作原理及其实现过程,包括如何通过摄像机位置、目标点和向上向量计算出视图矩阵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般我们设置视图矩阵就按照下面的方法设置

	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轴,并且是具有方向性的矩阵。

为什么最后要生成矩阵?
答:矩阵在计算时候方便快捷,如果使用点的话,每个点都需要通过三角函数或者数学公式
进行计算然后融合,而矩阵不需要。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值