ブレゼンハムはここであなたを助けません、私は恐れています...あなたが必要とするのは光線/線-平面交差アルゴリズムです:
非常に大まかなマシー擬似コード:
(注意: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>になります。
とりとめのない申し訳ありませんが、私は電車の中で家にいます。;)