使用DrawUserPrimitive并将其转换为一些矩阵

时间:2012-08-20 13:46:21

标签: c# matrix xna primitive

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

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

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

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

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

  3. 为了说明起见,有些代码:

    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);
    
    }
    

1 个答案:

答案 0 :(得分:0)

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

使用Matrix堆栈存储“铅笔”的当前状态是解决方案。但是有些东西我不知道了:

每当你深入了解对象层次结构(例如:机器人的手臂)时,你将新矩阵乘以当前的矩阵并将得到的放在堆栈上。因此,堆栈始终具有(在其自身之上)必须用于绘制的矩阵。完成此对象并返回其父对象后,只需弹出一次,然后检索要用于它的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();
            }
        }
    }
}