2012-12-28 52 views
1

我正在編寫xna的基本遊戲。我開始在玩家的右臂上放置一個物體(例如武器)。當我將角色向左或向右移動時。但是當我旋轉我的設備沒有正確定位。 我完全理解,有必要重新計算基於旋轉完成的新位置,但我不知道如何。 這裏是我的代碼和圖片 一千謝謝如何計算旋轉[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

圖A: 位置:X:0,Y:0; Z:0 角度:90 圖B: 位置:x:2; y:4; z:0 角度:90 enter image description here 圖A: 位置:X:1; Y:0; Z:1 角:35 圖B: 位置:如何演算該位置? 角:35

+0

你見過這個嗎? http://stackoverflow.com/questions/13890820/rotating-objects-attached-to-other-objects/13893855#13893855 – neeKo

+0

謝謝!你可以寫這個答案嗎? –

回答

1

基於this stackoverflow answer,對於附加的對象的變換是:

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

變量名是自解釋的。

+0

你是一個大老闆! –

+0

最後一個問題! 「ParentPosition」等於玩家的位置或對象? –

+1

@MehdiBugnard對象所在實體的位置 - 可能是您的案例中的玩家。 – neeKo