基于Visual C#的DirectX开发实例——视图矩阵
来源:互联网 发布:c语言api手册 编辑:程序博客网 时间:2024/04/27 21:55
视图矩阵
也称为摄像机矩阵,它是有三部分组成,即摄像机位置、目标位置以及摄像机上下方向来组成。在DirectX中提供了方法来通过这三部分来形成一个视图矩阵,这三个参数都为空间向量(Vector3)。在形成视图矩阵过程中,如下图所示,以摄像机位置为起点、摄像机目标位置为终点的单位向量作为摄像机空间的Z’轴坐标(相对于世界空间),然后根据左手法则或右手法则计算出摄像机空间的X’轴坐标,最后计算出摄像机空间的Y’轴坐标。所以视图矩阵中保存摄像机空间X’、Y’和Z’轴坐标在X、Y和Z方向上的分量,以及在摄像机空间中世界坐标原点的位置。
在DirectX中提供了两种方式来创建视图矩阵,即Matrix.LookAtLH()和Matrix.LookAtRH(),分别用于创建左手法则的视图矩阵和右手法则的视图矩阵,下面就介绍左手法则的视图矩阵,其定义如下:
public static Matrix LookAtLH( Vector3 cameraPosition, Vector3 cameraTarget, Vector3 cameraUpVector);
其中参数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);//显示视图矩阵
运行程序,其结果如下图所示:
- 基于Visual C#的DirectX开发实例——视图矩阵
- 基于Visual C#的DirectX开发实例——透视投影矩阵
- 基于Visual C#的DirectX开发实例——第一个DirectX程序
- 基于Visual C#的DirectX开发实例——绘制一个三角形
- 基于Visual C#的DirectX开发实例——输入事件
- 基于Visual C#的DirectX开发实例 ——二维显示
- 基于Visual C#的DirectX开发实例——绘制一个三角形
- 《基于Visual C# 的DirectX开发实例》目录
- Visual C# 的DirectX开发系列一初识DirectX
- Visual C# 的DirectX开发系列1初识DirectX
- 基于Visual C#的AutoCAD开发——实例1 基本例子
- 基于Visual C#的AutoCAD开发——实例4 多段线对象
- 基于Visual C#的AutoCAD开发——实例11 绘制基本图形
- Visual C# 的DirectX开发系列二了解摄像机
- 基于C#的DirectX开发(基础篇)一
- 基于C# 的 DirectX开发(基础篇)二
- 【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统
- 【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统
- 利用JDBC执行批处理插入数据
- SQL 2005远程访问的设置
- Accecc violation at address 0443E00B in module 'dbexpint.dll' 解决
- asp学习笔记
- 转别人的rails总结
- 基于Visual C#的DirectX开发实例——视图矩阵
- 开闭原则
- Symbian学习笔记一环境搭建
- 批量转换文件为utf-8格式
- HK积累
- 区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets函数
- 最近自己在写javascript/html/css的树控件
- [转]asp的textbox的javascript应用
- 安装了新插件Auto links和Acronym