您实际上不需要更改模型顶点即可实现模型空间到世界空间的转换。它通常是怎么做的:
- 您加载一次模型(顶点)。
- 您决定模型在当前帧中的外观:对象的平移(x,y,z),旋转(yaw,pitch,roll),缩放(x,y,z)
- 您根据以下信息计算矩阵:mtxTranslation、mtxRotation、mtxScale
- 你计算这个对象的世界矩阵:mtxWorld = mtxScale * mtxRotation * mtxTranslation。请注意,矩阵乘法不可交换:结果取决于操作数的顺序。
- 然后你应用这个矩阵(使用固定函数或内部顶点着色器)
在您的教程中:
D3DXMATRIX matTranslate; // a matrix to store the translation information
// build a matrix to move the model 12 units along the x-axis and 4 units along the y-axis
// store it to matTranslate
D3DXMatrixTranslation(&matTranslate, 12.0f, 4.0f, 0.0f);
// tell Direct3D about our matrix
d3ddev->SetTransform(D3DTS_WORLD, &matTranslate);
因此,如果您想在运行时移动对象,则必须更改世界矩阵,然后将该新矩阵推送到 DirectX(通过 SetTransform() 或通过更新着色器变量)。通常是这样的:
// deltaTime is a difference in time between current frame and previous one
OnUpdate(float deltaTime)
{
x += deltaTime * objectSpeed; // Add to x coordinate
D3DXMatrixTranslation(&matTranslate, x, y, z);
device->SetTransform(D3DTS_WORLD, &matTranslate);
}
float deltaTime = g_Timer->GetGelta(); // Get difference in time between current frame and previous one
OnUpdate(deltaTime);
或者,如果你还没有计时器,你可以简单地增加每帧的坐标。
接下来,如果你有多个对象(它可以是相同的模型或不同的)每一帧你做类似的事情:
for( all objects )
{
// Tell DirectX what vertexBuffer (model) you want to render;
SetStreamSource();
// Tell DirectX what translation must be applied to that object;
SetTransform();
// Render it
Draw();
}