2011-07-13 14 views
1

私のXNAゲームでは、2次元物理エンジンである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); 
    } 

答えて

0

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

+0

私はそれを試みましたが、それでも左上隅を回転しているようです。たぶん私は誤解しているかもしれません。おそらくコードスニペットを見ることはできますか? –

0

は、点(x、y、z)の周りの回転を行うために、操作を3つの概念的な部分に分割する必要がある:

  1. Tはによって並進変換行列です( - x、-y、-z)
  2. Rは関連する軸を中心に回転する回転行列です。
  3. T^-1

あなたが後にしているマトリックスは、逆の順序で、これら3つの乗算の結果である(X、Y、Z)に戻って変換行列である:

M = T^-1 * R^T

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

関連する問題