我还是直接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;
答案 0 :(得分:2)
实际上,您无需更改模型顶点即可实现模型空间到世界空间转换。 它通常如何做到:
在你的教程中:
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();
}