我已经尝试了一段时间来查找有关如何在 fbx 模型中移动特定骨骼的信息。我可以直接在模型上旋转“RootNode”
public void Update(GameTime gameTime)
{
_model.Bones["RootNode"].Transform = Matrix.CreateRotationY(MathHelper.ToRadians(_ANGLE)) * _model.Bones["RootNode"].Transform;
UpdateModelTransforms();
}
该模型应该是正确的,因为它是由专业的 3D 艺术家制作的,并且在 XNA 模型查看器中,一切都是可移动的并且看起来还不错。我可以选择一个特定的骨骼并根据需要移动它,但是当通过 XNA 中的代码选择相同的骨骼时,我无法让它工作。该模型是在 Maya 中制作的,使用默认的 phong-shader。以下是我认为最适合执行此操作的代码,取自各地不同的教程......
第二种方法适用于 RootNode,但在选择特定骨骼时,会发生注意!谁能注意到我做错了什么?
_model = _contentManager.Load<Model>("Models\\kenny_v002");
_originalBoneTransforms = new Matrix[_model.Bones.Count];
_worldTransforms = new Matrix[_model.Bones.Count];
_transforms = new Matrix[_model.Bones.Count];
_model.CopyAbsoluteBoneTransformsTo(_transforms);
_model.CopyAbsoluteBoneTransformsTo(_originalBoneTransforms);
public void Update(GameTime gameTime)
{
int boneIndex = _model.Bones["RootNode"].Index;
_transforms[boneIndex] = Matrix.CreateRotationY(_ANGLE) * _originalBoneTransforms[boneIndex];
//Root bone
_worldTransforms[0] = _transforms[0];
//Child bones
for (int bone = 1; bone < _worldTransforms.Length; bone++)
{
int parentBone = _model.Bones[bone].Parent.Index;
_worldTransforms[bone] = _transforms[bone] * _worldTransforms[parentBone];
}
}
public void Draw()
{
foreach (ModelMesh mesh in _model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.World = _worldTransforms[mesh.ParentBone.Index];
effect.Projection = _projection;
effect.View = _view;
}
mesh.Draw();
}
}
修改骨骼就够了吗?还是我也必须修改网格?