2

2Dアイソメトリックレンダラーを作成しました。正常に動作しますが、4つの異なる視点(NW SE SWなし)からシーンを表示したいのですが、90°回転すると、カメラがシーンの中心を画面上に維持できません。

何が機能しているのか:

  • 新しいビューポート(私の世界ではxyz)に一致するように、シーンの新しい投影を計算します。
  • シーン(チャンク)の一部を再編成して、正しい順序で描画します
  • 「チャンク」の「タイル」を再編成して、正しい順序で描画します
  • 180度回転することで正しい中心を保つことができます。

何が機能していないのか:

  • 90度回転した後、カメラに適用する正しい平行移動が見つかりません。

私が知っていること :

  • 私のカメラで180°回転して同じ中心を保つために、私はこれをしなければなりません:

camera.Position -= new Vector2(2 * camera.Position.X + camera.Width, 2 * camera.Position.Y + camera.Height);

SEの観点から見た ここに画像の説明を入力してください ここに画像の説明を入力してください

4

1 に答える 1

1

マップの中心がorigo(0,0,0)の場合、これは簡単になります。

まず、デフォルトのカメラ位置をVector3 CameraOffsetに保存し、次に回転行列を使用して位置を計算します。レディアンの90*は円周率の半分なので、PiOverTwoを使用します。また、列挙型を使用して、ポイントする方向を決定するので、次のように言うことができます

Camera.Orientation = Orientation.East;

そしてカメラはそれ自体を修正する必要があります:)

public enum Orientation
{
    North, East, South, West
}

カメラで:

public Vector3 Position { get; protected set; }

Vector3 _CameraOffset = new Vector3(0, 20, 20);
public Vector3 CameraOffset
{
    get
    {
        return _Orientation;
    }

    set
    {
        _Orientation = value;
        UpdateOrientation();
    }
}

Orientation _Orientation = Orientation.North;
public Orientation Orientation
{
    get
    {
        return _Orientation;
    }

    set
    {
        _Orientation = value;
        UpdateOrientation();
    }
}

private void UpdateOrientation()
{
    Position = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOverTwo * (int)Orientation));
}

ポジション間の滑走運動が必要な場合は、私もお手伝いできると思います;)

カメラがVector3.Zeroに焦点を合わせておらず、その周りを回転してはならない場合は、次のように変更する必要があります。

Position = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOverTwo * (int)Orientation));

に:

Position = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOverTwo * (int)Orientation) * Matrix.CreateTranslation(FocusPoint));

ここで、FocusPointは、回転する3Dのポイント(世界の中心)です。また、Camera.Update()でUpdateOrientation()を呼び出すと、カメラを動かす方法もわかります;)

編集; 申し訳ありませんが、2Dを使用するという点を完全に見逃しました。私が助けることができるかどうかを確認するために後で戻ってきます:P

于 2013-02-22T08:59:36.190 に答える