8

さて、これは単純なマトリックスの質問であるべきですが、私のマトリックスの理解はやや限られています. シナリオは次のとおりです: 1px x 1px のスプライトがあり、x と y の量 (両側で異なる量) でスケーリングし、そのスプライトを角度で回転させたいと考えています。全体を正確に配置します(左上または中央から、私には違いはありません)。

これまでのところ、私のコードは漠然と近いですが、渡す角度に応じて、ランダムな量だけずれている傾向があります.

私はこれがそれを行うと思います:

        Point center = new Point( 50, 50 );
        float width = 60;
        float height = 100;
        float angle = 0.5;
        Vector3 axis = new Vector3( center.X, center.Y, 0 );
        axis.Normalize();
        Matrix m = Matrix.Scaling( width, height, 0 ) *
            Matrix.RotationAxis( axis, angle ) *
            Matrix.Translation( center.X, center.Y, 0 );

しかし、私はそれが正しい位置にあると思っていても、回転した線のスケールを縮小する傾向があります.

私もこれを試しました:

  Matrix m = Matrix.Transformation2D( new Vector2( center.X, center.Y ), 0f,
      new Vector2( width, height ), new Vector2( center.X, center.Y ),
      angle, Vector2.Zero );

線は正確なサイズと形状で正確に見えますが、正確に配置することはできません。上記の呼び出しの最後に移動ベクトルを使用した場合、または Sprite.Draw を使用して位置を設定した場合、どちらも正しく機能しません。

これはすべてSlimDXにあります。私は何を間違っていますか?

4

4 に答える 4

12

マトリックス変換を学習するという苦痛を経験しましたが、XNA を使用しています。

これらの 記事 は、何が起こるかを理解するの 非常に役立つことがわかりました。XNA のメソッド呼び出しは非常に似ており、その背後にある理論はすべて、SlimDX を使用する場合にも当てはまります。

あなたのコードをちらりと見てから、最初に原点に翻訳し、最後に最終位置に翻訳する必要があると思いますが、私はまだ少し初心者です。

私がそれを行う順序は次のとおりです。

  • 元に翻訳
  • 規模
  • 回転する
  • 希望の場所に翻訳

最初に原点に変換する理由は、回転が原点に基づいているためです。したがって、特定の点を中心に何かを回転させるには、回転する前にその点を原点に置きます。

于 2009-03-11T20:04:07.820 に答える
3

さて、これは現在機能しています。他の誰かがそれを必要とする場合に備えて、これのための私の作業コードは次のとおりです。

    Point sourceLoc = new Point ( 50, 50 );
    float length = 60;
    float thickness = 2;
    float angle = 0.5;
    Matrix m = Matrix.Scaling( length, thickness, 0 ) *
            Matrix.RotationZ( angle ) *
            Matrix.Translation( sourceLoc.X, sourceLoc.Y, 0 );
    sprite.Transform = m;

    sprite.Draw( this.tx, Vector3.Zero, Vector3.Zero, Color.Red );

これにより、選択した長さの角度の付いた線が描画され、太さは選択した太さに等しくなります(テクスチャが1x1ピクセルの白い画像であると想定)。ソースの場所は、指定した角度(ラジアン)で線が放射される場所です。したがって、ゼロから開始し、2PIに達するまで0.1のように増分してから、0にリセットすると、時計の針やレーダースイープのように中心を中心に回転する線ができます。これが私が探していたものです-貢献してくれたすべての人に感謝します!

于 2009-03-12T02:32:52.627 に答える
1

正しい軸を中心に回転していますか? 私はマトリックスの初心者ですが、スプライトが x、y 空間に存在するため、回転軸は Z 軸、つまり (0,0,1) である必要があるようです。

于 2009-03-11T20:30:02.127 に答える