3

カメラの動作を処理する Camera クラスがあります。そのフィールドの中には、ターゲットの Cube クラスへの参照があります (Cube はオブジェクトの 1 つにすぎませんが、簡単にするために他のオブジェクトについては言及しません)。ビュー マトリックスを計算するには、カメラの位置とターゲットの位置が必要なので、「カメラはここに配置され、ここからこの立方体を見ている」とプログラムに説明できます。立方体が動き回ると、カメラの視点も自動的に変化します。

Cube クラスに依存する Camera クラスと、何も依存しない Cube クラスがあります (この例では)。

立方体などを描画する必要があるときに問題が発生します-何かを描画するために、必要な値の中でカメラのビューマトリックス。これは、最初の段落で計算したものです。本質的に、これは、画面上に物を描画するようになると、Cube クラスも Camera クラスに依存するようになり、互いに依存するようになることを意味します。つまり、次のいずれかになります。

  1. Cube クラスから直接アクセスできるように、Camera クラスの View マトリックス フィールドを静的にする必要があります。
  2. Cube クラスでメソッド (SetView など) を作成する必要があります。このメソッドを Camera クラスから呼び出すことができます (既にそこに参照があるため)。
  3. ビュー マトリックスをスコープ外に保持する必要があります。
  4. 双方向の依存関係を作成する必要があります。

しかし、私はこれらのどちらも好きではありません:

  1. 複数のビューを処理するカメラは他にもあり (現在、画面上に 3 台あります)、さらに多く (または少なく) ある可能性があります。
  2. これにより、コードがわずかに (場合によっては、非常に) 読みにくくなります。たとえば、キュ​​ーブを描画しているとき、View マトリックスがどこから来たのかがはっきりしません。
  3. カメラクラスから外部スコープにアクセスするか、外部スコープがカメラにアクセスしますが、外部スコープは実行メカニズムの処理にのみ使用されるため、これは望ましくありません。
  4. 参照フィールドは現在このシステムのどこにでもあるため、「読み取り専用」のままにしておくのが好きです。参照はコンストラクターで設定され、参照されたクラスからデータを取得するためにのみ使用されます。

また、明確にしていない場合は、複数の Camera オブジェクトと複数の Cube オブジェクトがあることを繰り返しましょう。カメラはキューブに依存する場合と依存しない場合がありますが、通常は少なくとも 1 つのカメラがキューブに依存しています。

任意の提案をいただければ幸いです:)

4

5 に答える 5

2

Cube が Camera に対して自分自身をレンダリングする方法を知っている必要がある (したがって、Camera について知っている必要がある) 場合、Camera が自分自身を Cube に合わせる方法を知っていることはおそらく意味がありません。現在 Camera にある整列動作は、Cubes と Cameras の両方を認識している CameraDirector のような上位クラスに属している可能性があります。これにより、Camera の役割の一部が別の、より集中した CameraDirector クラスに分割されるため、クラスの結束が向上します。これにより、カメラはコア ジョブに集中できるようになり、理解と保守が容易になります。

于 2010-10-18T15:37:46.037 に答える
1

2つの代替オプション:

  1. CameraとCubeの基本クラスを作成します。これらのクラスは相互にリンクしていませんが、使用するロジックのほとんどが含まれています。次に、BaseCameraオブジェクトではなくCameraオブジェクトを割り当てるCubeにBaseCamera参照を追加できます。(そしてBaseCubeフィールドを備えたカメラ。)これはポリモーフィズムの力です。
  2. ICameraおよびICubeインターフェースを定義します。次に、CameraクラスはICubeフィールドを使用してキューブにリンクし、その逆も同様です。

ただし、どちらのソリューションでも、新しいカメラオブジェクトとキューブオブジェクトを作成して解放するときは注意が必要です。私の個人的な好みは、インターフェースの使用です。ICubeインターフェースとICameraインターフェースは相互にリンクしてはならないことに注意してください。それらの関連クラスは他のインターフェースにリンクしますが、インターフェースにはリンクしません。

于 2010-10-18T14:14:47.590 に答える
1

各オブジェクト クラスが独自のレンダリングを担当するようにしました。

あなたの場合、各レンダリングメソッドにグラフィックスインスタンスとオブジェクトに対する視点を渡す必要があります。

描画クラスは、すべてのオブジェクト クラスのインスタンスにアクセスし、各オブジェクトの描画メソッドを適切な順序で呼び出します。オブジェクト クラスには、視点からの距離を決定する別のメソッドが必要になる可能性があります。これにより、描画メソッドを最も遠いものから最も近いものへと呼び出すことができます。

于 2010-10-18T14:34:38.993 に答える
1

あなたのルーチンがs とsDrawWorld()について既に知っていると仮定すると、ビュー マトリックスを'sメソッドに渡します。CubeCameraCubeDraw()

foreach (Cube cube in cubes) {
    cube.Draw(..., mainCamera.ViewMatrix, ...);
}

その方法Cubeは にのみ「依存」し、 には依存MatrixしませんCamera。繰り返しますが、それは上記のルール 3 に違反している可能性があります。ただし、あなたのコードの一部を見なければ、これ以上のことはできません。

于 2010-10-18T14:07:29.197 に答える
0

XNAをしているとき、私は同じような問題を抱えていました。

Drawメソッドインターフェイスにカメラへのインターフェイスを追加することで解決しました。

かわいくなく、カメラはいたるところに渡されますが、うまく機能しました。

取得する本当のことは、更新ループと描画ループが分離していることです。

描画するときは、描画するオブジェクトのリストがあり、描画ルーチンにはいくつかのカメラクラスが渡されます。

レンダリングを必要とするすべてのオブジェクトのリストを生成するために、クラスへの方法でコーディングするための代替手段。これをカメラを含むレンダラーに渡します。

重要なのは、カメラのリストが、ゲームの状態を説明する論理パターンに属しているにもかかわらず、描画可能なオブジェクトのリストとともに維持されるということです。

制御の反転について読んでください。私が本当に説明しているのはそれだけです。

于 2010-10-18T14:17:15.510 に答える