1

我正在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();
                }

            }

位置初始

图 A:位置:x:0;y:0;z:0 角度:90 图 B:位置:x:2;y:4;z:0 角度:90 在此处输入图像描述 图 A:位置:x:1;y:0 ;z:1 角度:35 图B:位置:如何计算这个位置? 角度:35

4

2 回答 2

1

基于这个 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);

变量名称是不言自明的。

于 2012-12-30T14:17:07.910 回答
0

我你必须从你的枪和它的位置得到旋转。然后为您的相机创建一个新的位置和旋转。您可以从http://msdn.microsoft.com/en-us/library/bb203909%28v=xnagamestudio.31%29.aspx找到一个非常精确和好的答案。附上示例代码。如果项目在运行前要求你注册到XBOX,你直接删除Xbox项目,保留windows项目。

于 2014-05-21T07:26:58.103 回答