1

私は一人称 3D ゲームに取り組んでいます。レベルは完全に立方体ベースで、壁/床/その他はすべてタイル張りの立方体 (1x1x1) です。

現在、カメラの位置とカメラの回転を使用して方向を取得する光線を作成しています。次に、空ではない最初のキューブにレイキャストアウトしたいと考えています(またはレイがグリッドから落ちたとき)。多くの場合、これらは 0,0,1 や 1,0,0 などの方向ベクトルです。

始点/終点ではなく方向ベクトルで機能する Bresenham Line Drawing Algorithm を見つけるのにあまり運がありません。特に、方向ベクトルが整数のみを格納するわけではないことを考慮してください。

したがって、特定の質問については、私がこれを正しい方法で行うことに近づいているかどうか、誰かがそれをどのように行うべきかについて詳しく説明できるかどうかを尋ねていると思います.

4

1 に答える 1

1

ブレゼンハムはここであなたを助けません、私は恐れています...あなたが必要とするのは光線/線-平面交差アルゴリズムです:

非常に大まかなマシー擬似コード:

(注意:3Dグラフィックスをやってから久しぶりです)

// Ray == origin point + some distance in a direction
myRay = Porg + t*Dir;

// Plane == Some point on cube face * normal of cube face (facing out),
// at some distance from origin
myPlane = Pcube * Ncubeface - d;

// Straight shot: from ray origin to point on cube direction
straightTo = (Pcube - Porg);

これらの2つの方程式を使用すると、いくつかのことを推測できます。

  • 'straightTo'と平面法線の内積がゼロ(これを「angA」と呼びます)の場合、原点は立方体の面の内側にあります。

  • 光線の方向と平面の法線の内積が0に近い場合(これを「angB」と呼びます)、光線は立方体の面に平行に走っています。つまり、交差していません(原点が上記の立方体の面)。

  • (-angA / angB)<0の場合、光線は立方体の面から離れる方向を向いています。

他にもありますが、私はすでに私の貧弱な記憶の限界を押し上げています。:)

編集:「ショートカット」があるかもしれませんが、少しは思いますが...これはすべて、「マップ」に3D配列のような構造を使用していることを前提としています。

さて、ここで私に耐えて、私の電話で考えて入力してください-標準の古いブレゼンハムデルタエラーアルゴリズムを使用したが、それを2Dに「修正」した場合はどうなりますか?

だから言いましょう:

  • 私たちは(10x10x10)「ボックス」の位置(5、5、5)にいます
  • (1 0 0)(つまり、+ X軸)を指しています
  • ビュー錐台の左上隅からキャストされた光線は、まだ単なる線です。「x」と「y」の変更の定義はすべてです
  • この場合の「X」は(精神的な視覚化)です...たとえば、目の線に平行な軸に沿っていますが、キャストラインと同じ高さです。つまり、(640x480)、「中心」が(0,0)、左上隅が(-320、-240)の2D画像を見ると、この「X軸線」は線になります。ポイント(-320,0)を介して無限にキャストします。
  • 「Y」も同様に通常の「Y」軸の投影であるため、頭を傾けない限り、ほとんど同じです。
  • さて、次のdeltaX値が何であるかを理解しようとすると、数学は地獄のように厄介になりますが、式を理解すると、基本的に一定時間の計算になります(そして今私が考えると、 「X軸」は、カメラの投影が何であれ、投影されたベクトル<100>になります。

とりとめのない申し訳ありませんが、私は電車の中で家にいます。;)

于 2012-11-28T21:54:49.390 に答える