一.Direct3D四大变换
<1.世界矩阵变换:
为了模拟3D物体的旋转,缩放,平移等功能,Direct3D将静态模型的顶点坐标x,y,z经过旋转平移矩阵变换以得到新的顶点坐标x1,y1,z1
D3DXMATRIX mTrans ;
D3DXMatrixTranslation (&mTrans , 5 , - 3 , 0 );
g_pd3dDevice->SetTransform (D3DTS_WORLD , &mTrans) ;
<2.取景变换:
为投影变换做准备,设置摄像机camera的坐标,观察点坐标,观察方向向量.
D3DXMATRIX matView; //定义一个矩阵
D3DXVECTOR3 vEye(0.0f, 0.0f, -200.0f); //摄像机的位置
D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f); //观察点的位置
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);//向上的向量
D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp); //计算出取景变换矩阵
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); //应用取景变换矩阵
<3.投影变换:
计算机屏幕是2D界面,为了渲染3D模型故设计投影变换矩阵,可将3D模型投影到2D屏幕上.投影变换矩阵可设置摄像机光圈大小,视觉深度等参数.
D3DXMATRIX matProj; //定义一个矩阵
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4.0f, 1.0f, 1.0f, 1000.0f);//计算投影变换矩阵
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj); //设置投影变换矩阵
<4.视口变换
将投影结果选择性投射到2D屏幕中.
D3DVIEWPORT9 vp; //实例化一个D3DVIEWPORT9结构体,然后做填空题给各个参数赋值就可以了
vp.X = 0; //表示视口相对于窗口的X坐标
vp.Y = 0; //视口相对对窗口的Y坐标
vp.Width = WINDOW_WIDTH; //视口的宽度
vp.Height = WINDOW_HEIGHT; //视口的高度
vp.MinZ = 0.0f; //视口在深度缓存中的最小深度值
vp.MaxZ = 1.0f; //视口在深度缓存中的最大深度值
g_pd3dDevice->SetViewport(&vp); //视口的设置
二.Unity3D中的坐标系
为了简化矩阵变换操作和实际应用,游戏引擎将矩阵变换经过封装和处理后变成坐标系,通过提供坐标系之间的变换接口实现我们常用的功能.
世界坐标系:与Direct3D世界坐标系相同,是物体的绝对坐标x,y,z
局部坐标系:与世界矩阵变换对应的坐标系,物体局部坐标×世界矩阵变换 = 物体世界坐标x,y,z
屏幕坐标系:与投影变换对应的坐标系,物体世界坐标×投影变换矩阵 = 2D屏幕坐标x,y
视口坐标系:与视口变化对应,为物体在实际渲染窗口中的2D屏幕坐标x,y
三.相对坐标与相对运动
在实际的游戏场景中,人物或者物体的移动是向前,向后,向左运动,是基于局部坐标系的位置偏移量.在blender中通过修改游标控制本地坐标系原点.
C++游戏引擎一般提供绕世界坐标系旋转,绕本地坐标系旋转,沿本地坐标系移动,沿世界坐标系移动,获取一个物体相对于另一个物体的相对坐标等API实现物体相对运动坐标的确定和调整.
例如Unity