2012-12-28 3 views
1

Je suis en train de programmer un jeu de base sur xna. J'ai commencé à placer un objet (par exemple une arme) attaché au bras droit de mon joueur. Quand je déplace mon personnage vers l'avant derrière la gauche ou la droite, tout va bien. Mais quand je tourne, mon équipement n'est pas positionné correctement. Je comprends parfaitement qu'il est nécessaire de recalculer la nouvelle position en fonction de la rotation effectuée mais je ne vois pas comment. Voici mon code et les images Mille merciComment calculer la position d'un modèle attaché après rotation [XNA]?

 //Function that will draw the current item selection in the player's hand    
private void draw_itemActionInUse(Model modelInUse) 
      { 

       int handIndex = skinningData.BoneIndices["Hand_Right"]; 

       Matrix[] worldTransforms = animationPlayer.GetWorldTransforms(); 

       Matrix rotationMatrixCalcul = Matrix.CreateRotationY(player.Rotation.Y); 
//Here I calculate the new position of the item, but it does not work 
       Vector3 newPosition= Vector3.Transform(new Vector3(player.Position.X, player.Position.Y + 4, player.Position.Z), rotationMatrixCalcul); 
       foreach (ModelMesh mesh in modelInUse.Meshes) 
       { 
        foreach (BasicEffect effect in mesh.Effects) 
        { 

         effect.World = 
    worldTransforms[handIndex] 
    * 
    Matrix.CreateScale(2) 
    * 
    Matrix.CreateRotationY(player.Rotation.Y) 
    * 
    Matrix.CreateTranslation(newPosition); 

         effect.View = View_; 
         effect.Projection = Projection_; 

         effect.EnableDefaultLighting(); 
        } 

        mesh.Draw(); 
       } 

      } 

Position initial

Figure A: Position: x: 0; y: 0; z: 0 Angle : 90 Figure B: Position: x: 2; y: 4; z: 0 angle : 90 enter image description here Figure A: Position: x: 1; y: 0; z: 1 angle: 35 Figure B: Position: Comment cette position calcul? angle: 35

+0

Avez-vous vu cela? http://stackoverflow.com/questions/13890820/rotating-objects-attached-to-other-objects/13893855#13893855 – neeKo

+0

Merci! Pouvez-vous écrire ceci pour une réponse? –

Répondre

1

Basé sur this stackoverflow answer, la transformation de l'objet attaché est la suivante:

Matrix positionRotationMatrix = Matrix.CreateTranslation(-parentPosition) 
           * Matrix.CreateFromQuaternion(parentRotation) 
           * Matrix.CreateTranslation(parentPosition); 
Vector3 translation = Vector3.Transform(parentPosition + relativePosition, 
           positionRotationMatrix); 

Matrix worldMatrix = Matrix.CreateScale(scale) 
       * Matrix.CreateFromQuaternion(rotation) 
       * Matrix.CreateFromQuaternion(parentRotation) 
       * Matrix.CreateTranslation(translation); 

Les noms de variables sont explicites.

+0

vous êtes un grand patron! –

+0

une question! "ParentPosition" est égal à la position ou à l'objet du joueur? –

+1

@MehdiBugnard la position de l'entité à laquelle votre objet est attaché - qui pourrait être le joueur dans votre cas. – neeKo

0

Vous devez obtenir la rotation de votre arme et sa position. Vous créez ensuite une nouvelle position et rotation pour votre caméra. Vous pouvez trouver une réponse très précise et bonne à partir de http://msdn.microsoft.com/en-us/library/bb203909%28v=xnagamestudio.31%29.aspx. L'exemple de code est joint. Si le projet vous demande de vous enregistrer sur XBOX avant de l'exécuter, acn suffit de supprimer le projet Xbox et de conserver le projet Windows.

Questions connexes