2008-12-01 10 views
2

J'ai essayé d'écrire une fonction TransformMesh. La fonction accepte un objet Mesh et un objet Matrix. L'idée est de transformer le maillage en utilisant la matrice. Pour ce faire, j'ai bloqué le vertex buffer, et appelé Vector3 :: TransformCoordinate sur chaque sommet. Il n'a pas pas produire des résultats attendus. Le maillage résultant était méconnaissable.Transformation d'un maillage Direct3D

Qu'est-ce que je fais mal?

// C++/CLI code. My apologies. 
int n = verts->Length; 
for(int i = 0; i < n; i++){ 
     verts[i].Position = DX::Vector3::TransformCoordinate(verts[i].Position, matrix); 
} 

Répondre

1

Je suis totalement d'accord avec Coincoin, le code contextuel aiderait.
Et si vous voulez simplement dessiner un maillage transformé à l'écran, vous n'avez pas besoin de transformer le maillage de cette manière. Vous pouvez simplement changer l'une des matrices du monde, de la vue et de la projection. Cela produit un résultat attendu. Comme dans l'exemple de code suivant.

 // Clear the backbuffer to a Blue color. 
    device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue, 
    1.0f, 0); 

    // Begin the scene. 
    device.BeginScene(); 

    device.Lights[0].Enabled = true; 

    // Setup the world, view, and projection matrices. 
    Matrix m = new Matrix(); 

    if(destination.Y != 0) 
    y += DXUtil.Timer(DirectXTimer.GetElapsedTime) * (destination.Y 
      * 25); 

    if(destination.X != 0) 
    x += DXUtil.Timer(DirectXTimer.GetElapsedTime) * (destination.X 
      * 25); 

    m = Matrix.RotationY(y); 
    m *= Matrix.RotationX(x); 

    device.Transform.World = m; 
    device.Transform.View = Matrix.LookAtLH(
     new Vector3(0.0f, 3.0f,-5.0f), 
     new Vector3(0.0f, 0.0f, 0.0f), 
     new Vector3(0.0f, 1.0f, 0.0f)); 
    device.Transform.Projection = Matrix.PerspectiveFovLH(
     (float)Math.PI/4, 1.0f, 1.0f, 100.0f); 

    // Render the teapot. 
    teapot.DrawSubset(0); 

    // End the scene. 
    device.EndScene(); 

Cet échantillon provient de here.

2

Sans code contextuel autour de ce que vous faites, il peut être difficile de connaître le problème exact. Comment le maillage est-il créé? Comment les verts sont-ils lus, comment est-il écrit? Essayez-vous de lire à partir d'un tampon vertex en écriture seule?

Ma recommandation serait d'essayer d'abord avec une matrice de traduction très simple et de déboguer le code et de voir l'entrée et la sortie du vertex. Voyez si vous recevez de bonnes données et si elles sont correctement transformées. Si c'est le cas, le problème est dans la foulée vertex, la déclaration de flux ou quelque chose d'autre plus profond dans le pipeline DirectX.

Comme je l'ai dit, plus de code serait nécessaire pour identifier l'origine du problème.

0

Je recommande d'utiliser la fonction D3DXConcatenateMeshes. Passer un maillage et une matrice. Le résultat sera transformé en mesh. C'est assez facile.