DirectX 9.0(世界坐标移动我的对象(三角形)动画

时间:2013-05-01 13:17:59

标签: c++ directx directx-9

我还是直接9.0的新手。如何在运行时移动我的对象或三角形?

根据本教程。 http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-5

我理解它的作用是移动相机坐标,设置世界坐标和proj坐标。如果我想要在运行时移动三角形位置怎么办?让我们说每帧移动x轴1px。

//A structure for our custom vertex type
struct CUSTOMVERTEX
{
  FLOAT x, y, z, rhw; // The transformed position for the vertex
  DWORD color;        // The vertex color
  FLOAT tu, tv;       // Texture position
};

我感觉我需要移动每个顶点的x,y,z的位置。但是我不可能释放顶点缓冲区,仅仅因为x,y,z而重复重新分配内存。这需要太多的计算。更不用说渲染了

如何在运行时访问invidual顶点并只修改其内容(X,Y,Z)而无需销毁和复制?

1)然而这引出了另一个问题。坐标本身就是模型坐标。所以问题是如何更改世界坐标或定义每个对象并进行更改。

LPDIRECT3DVERTEXBUFFER9 g_pVB;

1 个答案:

答案 0 :(得分:2)

实际上,您无需更改模型顶点即可实现模型空间到世界空间转换。 它通常如何做到:

  • 您加载模型(顶点)一次。
  • 您决定模型在当前帧中的外观:翻译(x, y,z),旋转(偏航,俯仰,滚动),比例(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();
}