局部坐标系到世界坐标系:
物体的局部坐标(模型坐标)通过世界变换(IDirect3DDevice9::SetTransform(D3DTS_WORLD, matrix))变换到世界坐标。
将一个物体的中心置于世界坐标系的点(-3, 2, 6):
D3DXMATRIX matrix; D3DXMatrixTranslation(&matrix, -3.0f, 2.0f, 6.0f); Device->SetTransform(D3DTS_WORLD, matrix);
世界坐标系到观察坐标系:
在世界空间中,几何体和摄像机都是相对于世界坐标系定义的,当摄像机朝向任意时,投影变换或其他变换就略显困难或效率不高。为了简化运算,将摄像机的局部坐标系变换到与世界坐标系重叠(摄像机的朝向与世界坐标系的z轴一致),此时世界空间中的几何体也做相同的变换使摄像机的视场恒定。这种变换称为取景变换,变换后的几何体位于以摄像机为原点的观察坐标系。
//获得取景变换矩阵 D3DXMatrixLookAtLH(&matrix, &position, &targetPoint, &worldUp) //设置取景变换 Device->SetTransform(D3DTS_VIEW, &matrix);
取景变换矩阵推导过程:View Transform详解
观察坐标系到投影坐标系:
视锥体是一个三维体,它的位置和摄像机相关,视锥体的形状决定了模型如何从投影到屏幕上。最常见的投影类型-透视投影,使得离摄像机近的物体投影后较大,而离摄像机较远的物体投影后较小。透视投影使用棱锥作为视锥体,摄像机位于棱锥的椎顶。该棱锥被前后两个平面截断,形成一个棱台,叫做View Frustum,只有位于Frustum内部的模型才是可见的。
在DirectX中,投影变换将观察坐标系中的顶点变换到投影坐标系(如下图右边的立方体),经过投影变换变换后的坐标仍然是三维的,z坐标被缩放到[0, 1]。x坐标范围是[-1, 1],y坐标范围是[-1, 1]。
设置投影变换矩阵:
D3DXMATRIX proj; D3DXMatrixPerspectiveFovLH(&proj, fov, aspect, zn, zf); Device->SetTransform(D3DTS_PROJECTION, &proj);