Правильно ли вращать кости модели с кожей? XNA - PullRequest
0 голосов
/ 16 января 2012

Как мне вращать кости Скинованной Модели вокруг себя, а не из источника модели?

В SkinningSample, когда я поворачиваю предплечье чувака, оно вращается вокруг того, что кажется источником модели.Я хотел бы вращать кости вокруг их собственного происхождения, если это возможно.

Описание для GetSkinTransforms() гласит:

"Получает текущие матрицы преобразования кости, относящиеся к позе связывания скинов."

Итак, яподозреваю, что это может быть проблемой.Кто-нибудь знает, как преобразовать эти преобразования в то, что они должны быть?

Вот часть SkinningSample.

  float rotation = 0;
    protected override void Update(GameTime gameTime)
    {
        HandleInput();

        UpdateCamera(gameTime);

        animationPlayer.UpdateWorldTransforms(Matrix.Identity);
        animationPlayer.UpdateSkinTransforms();

        Matrix RotationTransform = Matrix.CreateFromYawPitchRoll(rotation, 0, 0) ;
        animationPlayer.GetSkinTransforms().SetValue(RotationTransform, 34); 

        rotation = rotation + .1f;
        base.Update(gameTime);
    }


    /// <summary>
    /// This is called when the game should draw itself.
    /// </summary>
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice device = graphics.GraphicsDevice;

        device.Clear(Color.CornflowerBlue);

        Matrix[] bones = animationPlayer.GetSkinTransforms();

        // Compute camera matrices.
        Matrix view = Matrix.CreateTranslation(0, -40, 0) * 
                      Matrix.CreateRotationY(MathHelper.ToRadians(cameraRotation)) *
                      Matrix.CreateRotationX(MathHelper.ToRadians(cameraArc)) *
                      Matrix.CreateLookAt(new Vector3(0, 0, -cameraDistance), 
                                          new Vector3(0, 0, 0), Vector3.Up);

        Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,
                                                                device.Viewport.AspectRatio,
                                                                1,
                                                                10000);

        // Render the skinned mesh.
        foreach (ModelMesh mesh in currentModel.Meshes)
        {
            foreach (SkinnedEffect effect in mesh.Effects)
            {
                effect.SetBoneTransforms(bones);

                effect.View = view;
                effect.Projection = projection;

                effect.EnableDefaultLighting();

                effect.SpecularColor = new Vector3(0.25f);
                effect.SpecularPower = 16;
            }

            mesh.Draw();
        }

        base.Draw(gameTime);
    }

1 Ответ

0 голосов
/ 09 февраля 2012

Вы должны преобразовать boneTransform, а не skinTransform.Я только что создал другой метод в классе AnimationPlayer, чтобы разрешить эту манипуляцию:

public void TransformBone(Matrix BoneAlteration, int BoneID)
{
    boneTransform[BoneID] = BoneAlteration * bindPose[BoneID];
    UpdateWorldTransforms(Matrix.Identity);
    UpdateSkinTransforms();
}

Поэтому, если бы я хотел повернуть кость, я бы вызвал этот метод, чтобы создать правильную матрицу skinTransformation.Это предполагает, что другие boneTransforms установлены в их правильном положении.Я также думаю, что вы можете заменить bindPose на boneTransform, если хотите вращаться вокруг уже повернутой кости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...