Directx中的Matrix.LookAtLH();

视图矩阵

也称为摄像机矩阵,它是有三部分组成,即摄像机位置、目标位置以及摄像机上下方向来组成。在DirectX中提供了方法来通过这三部分来形成一个视图矩阵,这三个参数都为空间向量(Vector3)。在形成视图矩阵过程中,如下图所示,以摄像机位置为起点、摄像机目标位置为终点的单位向量作为摄像机空间的Z’轴坐标(相对于世界空间),然后根据左手法则或右手法则计算出摄像机空间的X’轴坐标,最后计算出摄像机空间的Y’轴坐标。所以视图矩阵中保存摄像机空间X’、Y’和Z’轴坐标在X、Y和Z方向上的分量,以及在摄像机空间中世界坐标原点的位置。

 

在DirectX中提供了两种方式来创建视图矩阵,即Matrix.LookAtLH()和Matrix.LookAtRH(),分别用于创建左手法则的视图矩阵和右手法则的视图矩阵,下面就介绍左手法则的视图矩阵,其定义如下:

public static Matrix LookAtLH( Vector3cameraPosition, Vector3 cameraTarget, Vector3cameraUpVector);

其中参数cameraPosition用于指定摄像机位置,参数cameraTarget用于指定摄像机目标位置,参数cameraUpVector用于指定当前世界坐标向上的方向,一般为(0,1,0)。

根据前面介绍的原理则可计算出视图空间各坐标轴的向量,如下:

cameraZaxis = Normalize(cameraTarget-cameraPosition)

cameraXaxis = Normalize(Cross(cameraUpVector, cameraZaxis))

cameraYaxis = Cross(cameraZaxis, cameraXaxis)

其中Normalize表示计算向量的单位向量, Cross表示计算两个向量的向量积。对应于视图矩阵中各个元素的值为:

cameraXaxis.X    cameraYaxis.X    cameraZaxis.X    0

cameraXaxis.Y    cameraYaxis.Y    cameraZaxis.Y    0

cameraXaxis.Z    cameraYaxis.Z    cameraZaxis.Z    0

DXY            DYP            DZP            1

其中:

DXY = -Dot(cameraXaxis,cameraPosition)

DYP = -Dot(cameraYaxis, cameraPosition)

DZP = -Dot(cameraZaxis, cameraPosition)

Dot表示计算两个向量的数量积。


如下用于计算视图矩阵的代码:

                Vector3 cameraPosition = new Vector3(0.0f, 5.0f, 10.0f);

                Vector3 cameraTarget = new Vector3(0.2f, 0.0f, 0.0f);

                Vector3 cameraUpVector = new Vector3(0, 1, 0);

 

                Vector3 cameraZaxis = Vector3.Normalize(cameraTarget-cameraPosition);

                Vector3 cameraXaxis = Vector3.Normalize(Vector3.Cross(cameraUpVector, cameraZaxis));

                Vector3 cameraYaxis = Vector3.Cross(cameraZaxis, cameraXaxis);

                Matrix viewMatrix=Matrix.Zero;


                viewMatrix.M11 = cameraXaxis.X; 

                viewMatrix.M12 = cameraYaxis.X; 

                viewMatrix.M13 = cameraZaxis.X;


                viewMatrix.M21 = cameraXaxis.Y; 

                viewMatrix.M22 = cameraYaxis.Y; 

                viewMatrix.M23 = cameraZaxis.Y;


                viewMatrix.M31 = cameraXaxis.Z; 

                viewMatrix.M32 = cameraYaxis.Z; 

                viewMatrix.M33 = cameraZaxis.Z;


                viewMatrix.M41 = -Vector3.Dot(cameraXaxis, cameraPosition);

                viewMatrix.M42 = -Vector3.Dot(cameraYaxis, cameraPosition);

                viewMatrix.M43 = -Vector3.Dot(cameraZaxis, cameraPosition);

                viewMatrix.M44 = 1;


                Console.WriteLine("视图矩阵为:");

                ShowMatrix(viewMatrix);//显示视图矩阵

其中Vector3.Normalize()方法用于计算向量的单位向量, Vector3.Cross()方法用于计算两个向量的向量积,Vector3.Dot()方法用于计算两个向量的数量积。运行程序,其结果如下图所示:

 

 

如果使用DirectX中的Matrix.LookAtLH()方法来创建视图矩阵,其代码如下:

                Vector3 cameraPosition = new Vector3(0.0f, 5.0f, 10.0f);

                Vector3 cameraTarget = new Vector3(0.2f, 0.0f, 0.0f);

                Vector3 cameraUpVector = new Vector3(0, 1, 0);

                Matrix viewMatrixComp = Matrix.LookAtLH(cameraPosition, cameraTarget, cameraUpVector);

                Console.WriteLine("视图矩阵为:");

                ShowMatrix(viewMatrixComp);//显示视图矩阵

运行程序,其结果如下图所示:

转载于:https://www.cnblogs.com/Vulkan/archive/2012/05/08/7530296.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值