我想创建一个移动的物体(比如人在移动或弹性弹簧),当移动时,物体的形状会发生变化。而且我不知道如何在 XNA 4.0 中创建 3D 模型形状变化。你能帮助我吗??谢谢!
问问题
460 次
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 回答