2013-05-01 5 views
2

I toujours nouvelle avec directe 9.0. Comment déplacer mon objet ou d'un triangle sur l'exécution?DirectX 9.0 (Coordonnées du monde décalant mon objet (triangle) animation

Selon, ce tutoriel. http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-5

Je comprends ce qu'il fait est de déplacer la caméra coordonnée, réglez le monde de coordonnées et proj coordonnées. et si j'ai je veux déplacer une position de triangle sur l'exécution? Disons que déplacer l'axe x par 1px par image.

//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 
}; 

J'ai le sentiment que J'ai besoin de décaler la position de x, y, z par sommets. Mais il est impossible pour moi de libérer le tampon des sommets, répétez la réaffectation de la mémoire juste à cause de x, y, z. Cela prendra trop de calculs. Comment puis-je accéder aux sommets individuels à l'exécution et modifier son contenu (X, Y, Z) sans avoir à détruire et copier?

1) Cependant ceci a conduit à une autre question. Les coordonnées elles-mêmes sont les coordonnées du modèle. Donc, la question est comment puis-je changer la coordonnée du monde ou définir par objet et le changer.

LPDIRECT3DVERTEXBUFFER9 g_pVB; 

Répondre

2

Vous n'avez pas réellement besoin de changer vos sommets de modèle pour atteindre l'espace de modèle à la transformation de l'espace mondial. Comme c'est généralement fait:

  • Vous chargez votre modèle (sommets) une fois.
  • Vous décidez comment votre modèle doit regarder dans le cadre actuel: traduction (x, y, z), rotation (lacet, tangage, roulis), échelle (x, y, z) vous opposez
  • Vous calcul matrices selon cette information: mtxTranslation, mtxRotation, mtxScale
  • Vous calculez la matrice du monde de cet objet: mtxWorld = mtxScale * mtxRotation * mtxTranslation. Notez que les multiplications matricielles sont non commutatives: le résultat dépend de l'ordre des opérandes.
  • Ensuite, l'application vous cette matrice (en utilisant la fonction fixe ou à l'intérieur vertex shaders)

Dans votre tutoriel:

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); 

Donc, si vous voulez déplacer votre objet dans l'exécution, vous devez changer la matrice du monde , puis poussez cette nouvelle matrice vers DirectX (via SetTransform() ou via la mise à jour de la variable shader). Habituellement, quelque chose comme ceci:

// 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); 

Ou, si vous ne vous pouvez tout simplement pas minuterie (encore) incrémenter coordonner chaque trame.

Ensuite, si vous avez plusieurs objets (il peut être même modèle ou différents) chaque image vous faire quelque chose comme:

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(); 
} 
Questions connexes