一.基本变换
当我们用Direct3D编程时,我们使用4 x 4矩阵描述变换操作,具体的思路是:先设置一个4 x 4矩阵M,然后为M的每一个元素赋值,使其满足一个特定的变换,然后,将一个点或者一个向量放到1 x 4 行向量v中,通过计算vM得到一个新的行向量v’,这就是变换后的向量。
注意:这里面有一个齐次坐标(homogeneous coordinate)的概念,通过第四个分量w决定描述的是一个点还是向量,即
(x,y,z,0):表示向量 (x,y,z,1)表示点
1.缩放
缩放矩阵:
Sx 0 0 0
S = 0 Sy 0 0
0 0 Sz 0
0 0 0 1
Sx ,Sy ,Sz 分别表示几何体沿着x,y,z轴的缩放倍数
2.旋转、
假设任意旋转轴n = (x,y,z),旋转角度 θ,则旋转矩阵如下:
Rn =
[
c+(1-c)x2 (1-c)xy+sz (1-c)xz -sy 0
(1-c)xy -sz c+(1-c)y2 (1-c)yz + sx 0
(1-c)xz +sy (1-c)yz - sx c+(1-c)z2 0
0 0 0 1
]
其中,c=cosθ、s=sinθ。
注意:在左手坐标系中,当沿着旋转轴的正轴方向俯视时,顺时针方向为正角。
3.平移
平移矩阵如下:
T =
[ 1 0 0 0
0 1 0 0
0 0 1 0
bx by bz 1
]
二.DX中的运用
D3DXMATRIX *WINAPI D3DXMatrixScaling(
D3DXMATRIX *pOut,
FLOAT sx,FLOAT sy,FLOAT sz
);
用途:
通过放缩系数sx,sy,sz生成放缩矩阵pOut
D3DXMATRIX *WINAPI D3DXMatrixRotationX
(
D3DXMATRIX *pOut,
FLOAT Angle;
);
用途:
生成一个旋转矩阵pOut,该矩阵绕X轴旋转Angle度(弧度制角度)
注意:同理 D3DXMatrixRotationY,D3DXMatrixRotationZ
D3DXMATRIX *WINAPI D3DXMatrixRotationAxis
(
D3DXMATRIX *pOut,
CONST D3DXVECTOR3 *pV,
FLOAT Angle
);
用途:
生成旋转矩阵pOut,该矩阵绕旋转轴pV旋转Angle
D3DXMATRIX *WINAPI D3DXMatrixTranslation
(
D3DXMATRIX *pOut,
FLOAT x,FLOAT y,FLOAT z
);
用途:
生成平移矩阵pOut,平移向量(x,y,z)
代码示例:
#include <iostream>
#define _USE_MATH_DEFINES // for C++
#include <cmath>
#include <D3DX10math.h>
#pragma comment(lib,"d3dx10.lib")
#pragma comment(lib,"d3dx10d.lib")
using namespace std;
ostream& operator<<(ostream& os,D3DXVECTOR4& v)
{
os<<"{"<<v.x<<","<<v.y<<","<<v.z<<","<<v.w<<"}";
return os;
}
ostream& operator<<(ostream& os,D3DXMATRIX& v)
{
for (int i=0;i<4;++i)
{
for (int j=0;j<4;++j)
{
os<<v(i,j)<<" ";
}
os<<endl;
}
return os;
}
int main()
{
D3DXVECTOR3 v(1.0f,1.0f,1.0f);
D3DXVECTOR4 X(1.0f, 2.0f , 3.0f , 0);
D3DXVECTOR4 Y;
D3DXMATRIX A(
1.0f, 2.0f , 3.0f , 0,
0 , 1 , 0 , 0,
0, 0, 1 , 0,
0, 0, 0 , 1
);
D3DXMATRIX B,C,D,E,F,G,H;
D3DXMatrixScaling(&B,1.0f,2.0f,3.0f);
C = A*B;
D3DXMatrixRotationX(&D,M_PI_2);//沿着X轴旋转90度
D3DXMatrixRotationY(&E,M_PI_4);//沿着Y轴旋转45度
D3DXMatrixRotationZ(&F,M_PI);//沿着Z轴旋转180度
D3DXMatrixRotationAxis(&G,&v,M_PI_2);//旋转向量v,旋转角度 90.0度
D3DXMatrixTranslation(&H,1.0f,2.0f,3.0f);//平移向量,返回平移矩阵
D3DXVec4Transform(&Y,&X,&A);
cout<<"A="<<endl<<A<<endl;
cout<<"B="<<endl<<B<<endl;
cout<<"C="<<endl<<C<<endl;
cout<<"X="<<X<<endl;
cout<<"Y="<<Y<<endl;
cout<<"D="<<endl<<D<<endl;
cout<<"E="<<endl<<E<<endl;
cout<<"F="<<endl<<F<<endl;
cout<<"G="<<endl<<G<<endl;
cout<<"H="<<endl<<H<<endl;
system("pause");
return 0;
}
结果显示:
注意事项:
1.要使用C++中的数学常量宏,需要在程序开始处声明
#define _USE_MATH_DEFINES // for C++
#include <cmath>
2.在程序中添加链接库的方法为
#pragma comment(lib,"XXX.lib")
前提是链接库的搜索路径已经被添加进系统中