しばらくの間、fbx モデルで特定のボーンを移動する方法に関する情報を見つけようとしました。モデルで直接行うことで、「RootNode」を回転させることができます
public void Update(GameTime gameTime)
{
_model.Bones["RootNode"].Transform = Matrix.CreateRotationY(MathHelper.ToRadians(_ANGLE)) * _model.Bones["RootNode"].Transform;
UpdateModelTransforms();
}
モデルはプロの 3D アーティストによって作成されているため、正しいはずです。また、XNA Model Viewer ではすべてが移動可能で、問題ないように見えます。特定のボーンを選択して好きなように動かすことはできますが、XNA のコードで同じボーンを選択するとうまくいきません。モデルは、デフォルトの phong-shader を使用して Maya で作成されています。以下は、さまざまなチュートリアルから取られた、これを行うのに最も適していると思うコードです...
この 2 番目のアプローチは 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();
}
}
骨を修正するだけで十分ですか?それとも、メッシュも変更する必要がありますか?