您的位置:首页 > 其它

[D3D9] 世界坐标转换矩阵的获取:旋转矩阵、平移矩阵、缩放矩阵

2017-05-10 16:31 519 查看
图元做世界坐标转换时,需要设置世界矩阵、视图矩阵、投影矩阵。其中世界矩阵由旋转矩阵、平移矩阵、缩放矩阵相乘后得到。

注意,因为矩阵的乘法不支持交换率,所以平移、旋转、缩放这几个矩阵相乘时的顺序不同,最终的运行效果也不一样,比如:

1、先平移后旋转:图元偏离中心,绕着轴做公转

2、先旋转后平移:图元偏离中心,绕着自己做自转

旋转矩阵的获取
const DWORD duration = 4000; // 旋转的周期是4秒钟
float tmp = float(GetTickCount() % duration) / float(duration) * 360;
tmp = tmp *  (float)3.1415926 / 180;

D3DXMATRIX wld;
D3DXMatrixRotationZ(&wld, tmp);
注意:D3DXMatrixPerspectiveFovLH、D3DXMatrixRotationX/Y/Z 这几个函数中,旋转参数的单位都是弧度。

弧度与角度的换算公式:弧度 = 角度 * π / 180

平移矩阵的获取
D3DXMATRIX* D3DXMatrixTranslation(D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z);
网上很多教程都说参数x、y、z是代表平移的像素。但是根据我的实际测试,当坐标系不同时,这几个参数的意义是不一样的。

如果是POSITION (D3DFVF_XYZ),x移动1.f,表示向x轴正方形移动宽度的一半(y和z同理)

如果是SV_POSION (D3DFVF_XYZRHW),x移动1.f,表示向x轴正方形移动一个像素(y和z同理)

缩放矩阵的获取
D3DXMATRIX * D3DXMatrixScaling(D3DXMATRIX *pOut, FLOAT sx, FLOAT sy,  FLOAT sz);
这个没什么好说的,sx等几个参数就是原始宽高的缩放比例

设置世界坐标转换矩阵
Device->SetTransform(D3DTS_WORLD, &wld);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息