1

私の XNA ゲームでは、物理エンジン データ用のオプションのレンダラーを備えた 2D 物理エンジンである Farseer Physics を使用して、デバッグを支援しています。ビジュアル デバッグ データは非常に便利なので、カメラの状態に応じて描画されるように設定しています。これは、z 軸の回転を除いて、完全に機能します。移動、ズーム、Z 軸回転をサポートするカメラ クラスがあります。私のデバッグ クラスは、Farseer のデバッグ レンダラーを使用して、カメラに応じてデバッグ データを描画するマトリックスを作成します。1 つのことを除いて、それはうまく機能します..z 軸の回転は、画面の左上隅を使用します ( 0, 0)、カメラはビューポートの中心を (0, 0) として使用して回転します。誰か私に何かヒントはありますか?デバッグ ドロワーを中心から回転させることができれば、私のカメラと完全に連携します。

        public void Draw(Camera2D camera, GraphicsDevice graphicsDevice)
    {
        // Projection (location and zoom)
        float width = (1f / camera.Zoom) * ConvertUnits.ToSimUnits(graphicsDevice.Viewport.Width / 2);
        float height = (-1f / camera.Zoom) * ConvertUnits.ToSimUnits(graphicsDevice.Viewport.Height / 2);
        //projection = Matrix.CreateOrthographic(width, height, 1f, 1000000f);
        projection = Matrix.CreateOrthographicOffCenter(
            -width,
            width,
            -height,
            height,
            0f, 1000000f);

        // View (translation and rotation)
        float xTranslation = -1 * ConvertUnits.ToSimUnits(camera.Position.X);
        float yTranslation = -1 * ConvertUnits.ToSimUnits(camera.Position.Y);
        Vector3 translationVector = new Vector3(xTranslation, yTranslation, 0f);
        view = Matrix.CreateRotationZ(camera.Rotation) * Matrix.Identity;
        view.Translation = translationVector;

        DebugViewXNA.RenderDebugData(ref projection, ref view);
    }
4

2 に答える 2

0

一般に、点 (x、y、z) を中心に回転を実行するには、操作を 3 つの概念的な部分に分割する必要があります。

  1. T は、(-x、-y、-z) で移動する移動行列です。
  2. R は、関連する軸を中心に回転する回転行列です。
  3. T^-1 は (x, y, z) に変換される行列です。

求めている行列は、これら 3 を逆順に乗算した結果です。

M = T^-1 * R^T

使用する x、y、z はカメラの位置です。

于 2011-07-13T19:46:47.230 に答える
0

この種の問題を解決するための一般的なアプローチの 1 つは、問題のオブジェクトを「中心」に移動し、回転させ、元に戻すことです。したがって、この場合、カメラを画面サイズの半分だけ「上および横」に移動する変換を適用し、回転を適用してから元に戻すことをお勧めします。

于 2011-07-13T04:38:14.177 に答える