DirectX&Direct 3D 游戏开发之3D图形的数学基础
3D坐标系统和坐标
3D笛卡尔坐标系统分为左手和右手笛卡尔坐标系统
DirectX使用左手系统,XNA使用右手系统
Public Vector3();
Public Vector3(float x, float y, float z);
当使用仿射矩阵对3D坐标点进行移位、旋转等复合变换时,点的3D坐标必须使用Vector4结构表示。
向量(scalar)
Dirrect 3D和XNA用vector3结构表示向量,其提供的求向量长度的方法:
Public float Length();
Public static float Length(Vector source);
Vector3结构提供求单位向量的方法:
Public void Normalize();
Public static Vector3 Normalize(Vector3 source);
向量和:
Public static Vector3 Add(Vector3 left,Vector right);
Public void Add(p1,p2);
Vector3 p1 = new Vector3(4, 5, 6); Vector3 p2 = new Vector3(1, 2, 3); Vector3 p3 = Vector3.Add(p1, p2);//向量和
表量乘向量:
Public void Mutiply(float s);
Public static Vector3 Mutiply(Vector3 source,float f);
Vector3 p4 = Vector3.Multiply(p3, 2.0f);//标量乘向量
标量积(点积)
标量积主要用来计算光照。
Public static float Dot(Vector3 left,Vector rigght);
float m = Vector3.Dot(p1, p2);//标量积
矢量积:
主要用来计算平面的法线向量。
Public static Vector3 Cross(Vector3 left,Vector right);
Vector3 p5 = Vector3.Cross(p1, p2);//矢量积
矩阵和Matrix结构
单位矩阵
Matrix m1 = Matrix.Identity;//单位矩阵
矩阵相加
Public static Matrix Add(Matrix left,Matrix right);
矩阵相减
Public static Matrix Subtract(Matrix left,Matrix right);
矩阵相乘
Public void Mutiply(Matrix source);
Public static Matrix Mutiply(Matrix left,Matrix right);
求逆矩阵
Public void Invert();
Public static Matrix Invert(Matrix source);
求转置矩阵
Public void Transpose(Matrix source);
Public static Matrix TransposeMatrix(Matrix source);
仿射矩阵
2D仿射矩阵 第3列固定为0 0 1
3D 仿射矩阵(3D变换矩阵) 任何一个3D坐标系统中的点用(x,y,z,1)表示,用一个4*4的3D仿射矩阵来记录各种3D复合变换的操作,包括平移、旋转、缩放等操作。在Direct 3D和XNA中,点的坐标(x,y,z,1)用Vector4结构表示,而4*4仿射矩阵用Matrix结构表示。
Matrix结构表示3D变换矩阵
(注意:这里列出的是在Direct 3D中的函数名称,在XNA中函数名称前要加Create)
平移变换
返回的Matrix结构是一个4*4的3D反射矩阵
Pubic static Matrix Translation(float x,float y,floar z); //XNA为CreateTranslation
或Pubic static Matrix Translation(Vector3 source);
旋转变换
Yaw、picch、roll分别表示绕Y轴、X轴、Z轴旋转弧度。
Public static Matrix RotationYawPitchRoll(float yaw,float pitch,float roll);
围绕中心轴旋转
Public static Matrix RotationX(float yaw);//围绕X旋转矩阵
Public static Matrix RotationY(float pitch); //围绕Y旋转矩阵
Public static Matrix RotationZ(float roll); //围绕Z旋转矩阵
比例变换
Public static Matrix Scaling(Single x,Single y,Single z);
或Public static Matrix Scaling(Vector3 source);
复杂的变换可采用矩阵乘法,矩阵乘法不满足乘法交换律。