以下是我的内容:自定义DrawableGameComponent
,其中包含我称之为DrawUserPrimitve
的子项。每个孩子都可以包含孩子等。
我在每个组件中存储描述其形状的顶点列表,并存储Matrix
以存储其相对位置(并最终转换)。
所以在我“DrawUserPrimitive
”之前,我需要“应用”一个矩阵。该矩阵必须是组件转换及其父级及其父级父级等的乘法。
这个系统允许我保持组件变量的独立性,如果我理解正确的话,这就是你要走的路。
为此,我在XNA中看到了BasicEffect
对象,我可以使用它来应用一些矩阵。所以我试图将basicEffect.World
乘以我的component.Transformation
(Matrix
)
所以我应该继续询问,但现在它没有给我我等待的结果。我想知道我是否选择了这样做的好方法。我看到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);
}
答案 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();
}
}
}
}