0

DrawableGameComponentこれが私が持っているものです:私がいくつかと呼ぶ子供を含むカスタムDrawUserPrimitve。各子には子などを含めることができます。各コンポーネントに、その形状を説明する頂点のリストと、Matrixその相対位置(および最終的には変換)を格納するためのリストを格納します。したがって、「DrawUserPrimitive」の前に、マトリックスを「適用」する必要があります。この行列は、コンポーネントの変換とその親およびその親の親などの乗算である必要があります。

このシステムにより、コンポーネントの変数を独立させることができます。正しく理解していれば、それが最善の方法です。

そうするために、私はXNAでオブジェクトを見ましたBasicEffect。これを使用して、いくつかの行列を適用できます。basicEffect.Worldだから私は私のcomponent.TransformationMatrix)で乗算しようとしています

ですから、引き続き調査する必要がありますが、今のところ、私が待ち望んでいた結果は得られません。私はこれを行うための良い方法を選んだのだろうか。同じ結果に対して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 に答える