0

这是我所拥有的:一个 custom DrawableGameComponent,包含我称之为 some 的孩子DrawUserPrimitve。每个孩子都可以包含孩子等。我在每个组件中存储一个描述其形状的顶点列表,并Matrix存储其相对位置(并最终转换)。所以在我“ DrawUserPrimitive”之前,我需要“应用”一个矩阵。该矩阵必须是组件转换及其父组件及其父组件等的乘积。

这个系统允许我保持组件的变量独立,如果我理解正确,那就是要走的路。

为此,我BasicEffect在 XNA 中看到了对象,我可以使用它应用一些矩阵。所以我试图将basicEffect.World与我的component.Transformation( Matrix)相乘

所以我应该继续询问,但现在它没有给我我正在等待的结果。我想知道我是否选择了这样做的好方法。我看到 2 个系统具有相同的结果:

  1. 我现在的情况,有点像固定铅笔但移动你的纸
  2. 或者在绘制之前添加一个遍历我所有顶点的循环,以根据预期的转换相应地修改这些顶点。有点像移动铅笔而不是纸。

为了说明起见,一些代码:

public void override Draw(GameTime gameTime){

    Game.basicEffect.World *= Transformation;

    foreach(var child in this.Children){
        child.Draw(gameTime);
    }

    Game.basicEffect.World *= Matrix.Invert(Transformation);

}
4

1 回答 1

0

感谢@nico-schertler 的评论,我能够做到。

拥有一个存储“铅笔”当前状态的矩阵堆栈是解决方案。但是我缺少一些东西:

每次您深入对象层次结构(例如:机器人的手臂)时,您都将新矩阵乘以当前矩阵并将结果放入堆栈。因此堆栈总是(在其自身之上)必须用于绘制的矩阵。当你处理完这个对象并返回到它的父对象时,只需弹出一次,你就可以检索到要用于它的 Matrix。(我正在堆叠每个矩阵,然后每次都重新计算要使用的结果矩阵。)

备注:注意乘法的顺序。矩阵的乘法不可交换!始终将您的子矩阵乘以当前矩阵。

internal void HandleDraw(GameTime gameTime)
{
    Draw(gameTime);

    if (Children.Count > 0)
    {
        // draw children
        foreach (Control child in Children.Values.OfType<Control>())
        {
            if (child.Visible)
            {
                Engine.CurrentTransformation.Push(Matrix.Multiply(
                    child.Transformation,
                    Engine.CurrentTransformation.Peek()
                ));

                child.HandleDraw(gameTime);

                Engine.CurrentTransformation.Pop();
            }
        }
    }
}
于 2012-09-03T08:07:29.267 回答