2010-07-11 6 views
0

Je suis assez nouveau pour le développement xna et je veux positionner les cubes du Primitives3D sample en passant un vecteur de position au constructeur .. Malheureusement, cela ne fonctionne pas .. au lieu de cela il tourne juste autour ..Positionner des objets 3D dans xna

est comment i modifié le code de la classe cubeprimitive:

public class CubePrimitive : GeometricPrimitive 
{ 
    public Vector3 position; 

    /// <summary> 
    /// Constructs a new cube primitive, using default settings. 
    /// </summary> 
    public CubePrimitive(GraphicsDevice graphicsDevice) 
     : this(graphicsDevice, 1, new Vector3(-3,0,0)) 
    { 
    } 

    /// <summary> 
    /// Constructs a new cube primitive, with the specified size. 
    /// </summary> 
    public CubePrimitive(GraphicsDevice graphicsDevice, float size, Vector3 posi) 
    { 
     this.position = posi; 

     // A cube has six faces, each one pointing in a different direction. 
     Vector3[] normals = 
     { 
      new Vector3(0, 0, 1), 
      new Vector3(0, 0, -1), 
      new Vector3(1, 0, 0), 
      new Vector3(-1, 0, 0), 
      new Vector3(0, 1, 0), 
      new Vector3(0, -1, 0), 
     }; 

     // Create each face in turn. 
     foreach (Vector3 normal in normals) 
     { 
      // Get two vectors perpendicular to the face normal and to each other. 
      Vector3 side1 = new Vector3(normal.Y, normal.Z, normal.X); 
      Vector3 side2 = Vector3.Cross(normal, side1); 

      // Six indices (two triangles) per face. 
      AddIndex(CurrentVertex + 0); 
      AddIndex(CurrentVertex + 1); 
      AddIndex(CurrentVertex + 2); 

      AddIndex(CurrentVertex + 0); 
      AddIndex(CurrentVertex + 2); 
      AddIndex(CurrentVertex + 3); 

      // Four vertices per face. 
      AddVertex(posi+(normal - side1 - side2) * size/2, normal); 
      AddVertex(posi + (normal - side1 + side2) * size/2, normal); 
      AddVertex(posi + (normal + side1 + side2) * size/2, normal); 
      AddVertex(posi + (normal + side1 - side2) * size/2, normal); 
     } 

     InitializePrimitive(graphicsDevice); 
    } 
} 

Pouvez-vous s'il vous plaît me montrer comment modifier correctement? .. merci d'avance :)

Répondre

1

Traditionnellement ce que vous faites lorsque vous voulez déplacer un modèle est, au lieu de modifier chacun des sommets du modèle, vous changez la matrice du monde.

Trouver cette ligne Primitives3DGame.cs:

Matrix world = Matrix.CreateFromYawPitchRoll(yaw, pitch, roll); 

Et changer quelque chose comme ceci:

Matrix world = Matrix.CreateFromYawPitchRoll(yaw, pitch, roll) 
       * Matrix.CreateTranslation(-3, 0, 0); 

(Et, bien sûr, enlever le changement que vous avez fait, telle que publiée dans votre question.)

Autant que je peux dire que votre code fonctionne réellement. Mais peut-être attendiez-vous que le cube tourne, mais reste au même endroit (ce que fait le code ci-dessus). Ce que vous faites est effectivement la même chose que:

Matrix world = Matrix.CreateTranslation(-3, 0, 0) 
       * Matrix.CreateFromYawPitchRoll(yaw, pitch, roll); 

Notez l'ordre inverse - vous faites la traduction de votre premier modèle et puis tournant autour de l'origine.

Questions connexes