1

しばらくの間、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();
    }
}

骨を修正するだけで十分ですか?それとも、メッシュも変更する必要がありますか?

4

0 に答える 0