XNA Вращай кость со смещением перевода - PullRequest
0 голосов
/ 09 января 2012

У меня есть модель, у которой есть кость, которая имеет смещенное смещение от родительской кости (она не расположена в хвостовой части родительской кости). В Blender, где была сделана модель, я могу вращать кость и видеть, что прикрепленная сетка вращается правильно. Однако, когда я пытаюсь повернуть кость в моем коде, кажется, что она вращается вокруг хвоста родителя. Я что-то напутал в математике Матрицы (мой злейший враг).

Обновление:

protected override void Update(GameTime gameTime)
    {
        bone.Transform =  Matrix.CreateFromYawPitchRoll(0f, 0.5f, 0f);

        base.Update(gameTime);
    }

Довольно стандартно, но если это имеет значение, Draw:

private void DrawModel(Model model, GraphicsDevice graphics, Matrix viewMatrix, Matrix projectionMatrix)
    {
        Matrix[] boneTransforms = new Matrix[model.Bones.Count];
        model.CopyAbsoluteBoneTransformsTo(boneTransforms);

        Matrix worldMatrix = orientation * Matrix.CreateTranslation(position);

        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.World = boneTransforms[mesh.ParentBone.Index] * worldMatrix;
                effect.View = viewMatrix;
                effect.Projection = projectionMatrix;

                effect.EnableDefaultLighting();
                effect.PreferPerPixelLighting = true;

                // Set the fog to match the black background color
                effect.FogEnabled = true;
                effect.FogColor = Vector3.Zero;
                effect.FogStart = 1000;
                effect.FogEnd = 3200;
            }
            mesh.Draw();
        }
    }

Вот скриншоты, чтобы показать проблему http://s1231.photobucket.com/albums/ee516/Neovivacity/?action=view&current=boneRotation.png

1 Ответ

1 голос
/ 12 января 2012

Хорошо, возможно, это не самый простой способ решения этой проблемы, но у меня есть исправление для тех, у кого также есть подобная проблема.

При загрузке модели сохраните исходное преобразование. Затем вы умножаете трансформацию кости, как я. Наконец, вы получаете исходное преобразование Transformation, например oringalTranform.Translation, и получаете новое преобразование кости. Чтобы скорректировать смещение, bone.Transform * = Matrix.CreateTranslation (originalTranslation - newTranslation).

Вот фрагмент кода из моего решения:

public void LoadContent(ContentManager content)
    {
        Model = content.Load<Model>(ModelName);
        //Set the Bone pointers and transform matrices
        AileronLBone = Model.Bones["LAileron"];
        AileronRBone = Model.Bones["RAileron"];
        ElevatorBone = Model.Bones["Elevator"];
        RudderBone = Model.Bones["Rudder"];
        FlapsBone = Model.Bones["Flaps"];
        if (AileronLBone != null) AileronLTransform = AileronLBone.Transform;
        if (AileronRBone != null) AileronRTransform = AileronRBone.Transform;
        if (ElevatorBone != null) ElevatorTransform = ElevatorBone.Transform;
        if (RudderBone != null) RudderTransform = RudderBone.Transform;
        if (FlapsBone != null) FlapsTransform = FlapsBone.Transform;
    }

    public void Update(GameTime gameTime)
    {
        SetOffsetRotation(ElevatorBone, ElevatorTransform, ElevatorRotation);
    }

    public void SetOffsetRotation(ModelBone bone, Matrix transform, float rotation)
    {
        Vector3 oringalTrans = transform.Translation;
        bone.Transform *= Matrix.CreateRotationX(rotation);
        Vector3 newTrans = bone.Transform.Translation;
        bone.Transform *= Matrix.CreateTranslation(oringalTrans - newTrans);
    }
...