0

我想创建一个移动的物体(比如人在移动或弹性弹簧),当移动时,物体的形状会发生变化。而且我不知道如何在 XNA 4.0 中创建 3D 模型形状变化。你能帮助我吗??谢谢!

4

1 回答 1

1

我也许可以给你一些初学者对初学者的建议。

我刚刚从这个例子中学会了如何制作一个模型,并根据你的问题,我对其中一个骨骼应用了一个额外的比例变换,看看我是否可以像操纵它的位置一样操纵它的大小,它确实有效。

所以我暗示你的问题的答案可能是,当模型的顶点数据保持不变时,你可以使用 Scale 变换使其改变形状。

这是我的模型:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace SimpleAnimation
{
    public class Body
    {
        Model bodyModel;
        ModelBone headBone;
        ModelBone bodyBone;
        Matrix headTransform;
        Matrix bodyTransform;
        Matrix[] boneTransforms;

        public Body()
        {
            HeadScale = 1;
        }

        public void Load(ContentManager content)
        {
            // Load the tank model from the ContentManager.
            bodyModel = content.Load<Model>("body");

            // Look up shortcut references to the bones we are going to animate.
            headBone = bodyModel.Bones["head"];
            bodyBone = bodyModel.Bones["body"];

            // Store the original transform matrix for each animating bone.
            headTransform = headBone.Transform;
            bodyTransform = bodyBone.Transform;

            // Allocate the transform matrix array.
            boneTransforms = new Matrix[bodyModel.Bones.Count];
        }

        public void Draw(Matrix world, Matrix view, Matrix projection)
        {
            // Set the world matrix as the root transform of the model.
            bodyModel.Root.Transform = world;

            // Calculate matrices based on the current animation position.
            Matrix headRotation = Matrix.CreateRotationX(HeadRotation);
            Matrix headScale = Matrix.CreateScale(HeadScale);
            Matrix bodyRotation = Matrix.CreateRotationX(BodyRotation);

            // Apply matrices to the relevant bones.
            headBone.Transform = headScale * headRotation * headTransform;
            bodyBone.Transform = bodyRotation * bodyTransform;

            // Look up combined bone matrices for the entire model.
            bodyModel.CopyAbsoluteBoneTransformsTo(boneTransforms);

            // Draw the model.
            foreach (ModelMesh mesh in bodyModel.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.World = boneTransforms[mesh.ParentBone.Index];
                    effect.View = view;
                    effect.Projection = projection;

                    effect.EnableDefaultLighting();
                }

                mesh.Draw();
            }
        }

        public float HeadRotation { get; set; }

        public float HeadScale { get; set; }

        public float BodyRotation { get; set; }
    }
}
于 2012-10-26T18:17:05.387 回答