2011-02-17 4 views
2

J'ai un simple carré je dessine dans l'espace 3D en utilisant Direct3D 11 et SlimDX, avec les coordonnées suivantes (je sais qu'il rend)Direct3D 11 worldviewprojection Matrice de transformation ne fonctionne pas

0,0,0.5 
0,0.5,0.5 
0.5,0.5,0.5 
0.5,0,0.5 

J'ai une classe de caméra qui gère le mouvement de la caméra en appliquant des transformations matricielles à la matrice de vue. par exemple. Camera.MoveForward (float x) déplace la caméra vers l'avant de x. Il contient également les matrices View et Projection. Je les instancie en utilisant le code suivant:

Matrix view = Matrix.LookAtLH(
    new Vector3(0f, 0f, -5f), 
    new Vector3(0f, 0f, 0f), 
    new Vector3(0f, 1f, 0f)); 
Matrix projection = Matrix.PerspectiveFovLH(
    (float)Math.PI/2, 
    WINDOWWIDTH/WINDOWHEIGHT, 
    0.1f, 
    110f); 

La matrice du monde est définie sur la matrice d'identité.

Dans mon code shader je transforme mes coordonnées en utilisant le code suivant:

PS_IN VS(VS_IN input) 
{ 
    PS_IN output = (PS_IN)0; 

    output.pos = mul(input.pos, WorldViewProjection); 
    output.col = float4(1,1,1,1); 

    return output; 
} 

Où worldviewprojection est défini dans mon code en utilisant les éléments suivants:

Matrix worldview = Matrix.Multiply(world, camera.ViewMatrix);  
Matrix worldviewprojection = Matrix.Multiply(worldview, camera.ProjectionMatrix); 

Je sais les transformations de la classe de la caméra travaillent Comme c'est l'ancien code que j'ai écrit pour une application MDX qui fonctionne bien, cependant quand je cours, je vois mon carré, et avancer et reculer marche très bien, mais tourner à gauche et à droite semble tourner le carré autour de l'axe Y (haut) de le traduire, m over haut et bas a un effet similaire, tournant à la place autour de l'axe X (horizontal).

Pour référence, les fonctions de mouvement de la caméra:

public void MoveRight(float distance) 
{ 
    position.Z += (float)(Math.Sin(-angle.Y) * -distance); 
    position.X += (float)(Math.Cos(-angle.Y) * -distance); 
    updateViewMatrix(); 
} 

public void MoveForward(float distance) 
{ 
    position.X += (float)(Math.Sin(-angle.Y) * -distance); 
    position.Z += (float)(Math.Cos(-angle.Y) * -distance); 
    updateViewMatrix(); 
} 

public void MoveUp(float distance) 
{ 
    position.Y -= distance; 
    updateViewMatrix(); 
} 

private void updateViewMatrix() 
{ 
    ViewMatrix = Matrix.Translation(position.X, position.Y, position.Z) * Matrix.RotationY(angle.Y) * Matrix.RotationX(angle.X) * Matrix.RotationZ(angle.Z); 
} 
+0

Le WorldViewProjection est-il extrait du fichier d'effets et réglé en conséquence? –

+0

Oui, lorsque je change la matrice de vue, l'affichage 3D se met à jour, ce qui signifie que les valeurs doivent passer correctement dans le shader, mais elles ne sont pas correctement mises à jour. –

+0

Est-ce que input.pos est un float3 ou un float4? –

Répondre

2

Le problème peut se situer dans la ligne:

output.pos = mul(input.pos, WorldViewProjection); 

je changerais output.pos d'être un float4 puis faire:

output.pos = mul(float4(input.pos, 1), WorldViewProjection); 

Faites-moi savoir comment cela fonctionne. Si ce n'est pas le problème, je vais regarder de plus près ce qui se passe.

+0

Cela fonctionne, mais j'ai aussi dû transposer (en utilisant Matrix.Transpose) la matrice WorldViewProjection avant de l'envoyer à mon shader. Apparemment, HLSL et C# représentent les matrices différemment en mémoire. –

+0

Oui, j'ai été en mesure de vérifier cela. Apparemment, je ne rencontrais pas ce problème parce que je mettais ma matrice WVP à travers un EffectMatrixVariable. Lorsque vous essayez de le définir en mettant à jour le tampon constant, vous devez transposer la matrice. –

Questions connexes