レイキャスティングチュートリアル/ベクトル数学の質問


8

私はhttp://lodev.org/cgtutor/raycasting.htmlでこの素晴らしいレイキャスティングチュートリアルをチェックしていて、おそらく非常に単純な数学の質問があります。

DDAアルゴリズムで、光線が1つのx側から次のx側へ、または1つのy側から次へと移動する距離であるdeltaDistXおよびdeltaDistY変数の計算を理解できません。 y側、世界地図を構成する正方形のグリッド内(下のスクリーンショットを参照)。

ここに画像の説明を入力してください

チュートリアルでは、それらは次のように計算されますが、あまり説明されていません。

//length of ray from one x or y-side to next x or y-side
double deltaDistX = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX));
double deltaDistY = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY));

rayDirYとrayDirXは、キャストされた光線の方向です。

これらの数式をどのように取得しますか?ピタゴラスの定理がその一部であるように見えますが、どういうわけかここに関与する分割があります。ここで不足している数学的知識について誰かが私に手掛かりを与えたり、それがどのように導出されたかを示すことによって式を「証明」したりできますか?


また、scratchapixel.com / lessons / 3d-basic-lessons /…も確認したいと思います。DDAの非常に優れた詳細な説明があります。
Grieverheart

回答:


8

ああそう。私はそれに数学を投げ、私はそれを打ったと思います。正解です。ピタゴラスの定理といくつかのスケーリングが関係しています。

まず、光線を表す正規化されたベクトルから始めます。

ここに画像の説明を入力してください

それは持っているxコンポーネントおよびyコンポーネントを。最初に、x方向に1ユニット移動するときの時間を確認します。どうしようか?xコンポーネントがと等しくなるように、ベクトル全体をスケーリングしたいとします1。何を基準にするかを判断するために、次のことを行います。

scaleFactor = 1/rayDirX;

数学でそれを書き出すことは本当にただです

scaledX = rayDirX * (1/rayDirX) = 1

したがって、それを単に呼び出すことができます1

次に、yコンポーネントについて:

scaledY = rayDirY * (1/rayDirX) = rayDirY/rayDirX

これで、スケーリングされたコンポーネントが (1, rayDirY/rayDirX)

今、私たちは長さを知りたいです。今度はピタゴラスが登場する。それは

length = sqrt((x * x) + (y * y))

したがって、スケーリングされたコンポーネントをプラグインすると、次のようになります。

length = sqrt((1 * 1 ) + (rayDirY / rayDirX) * (rayDirY / rayDirX))

代数を適用して単純化すると、次のようになります。

length = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX))

yコンポーネントが1ユニット移動するときの長さについても同じですが、次の(rayDirX/rayDirY, 1)結果になります。

length = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY))

あなたの質問からあなたの二つの方程式があります。かなりきちんとしています。代数演習をありがとう。


ああ、あなたは私を倒しました!非常に素晴らしい!
フィリップ

ハ、私は新しい答えがあるかどうかを確認し続けました!私は誰かとレースをしているように感じました:)
MichaelHouse

とても素敵です、ありがとう!予想していたよりもずっとわかりにくいものでした。
mattboy

私はそれをリバースエンジニアリングしようとするのをあきらめ、それを行っている場合にその値をどのように得るかを見つけようとしたときにのみ、答えを見つけました。ベクトルのスケーリングはある種の近道になると思いましたが、それは彼らがそれをしているのと同じ方法であることが
わかりまし

1

各グリッド距離の単位長を1と仮定します。

deltaDistX斜辺として構成される、投稿された図(OP質問)の三角形(三角形1)は、rayDir# Vector(三角形2)の構成要素によって形成される三角形に形成される角度の余弦値と同じ角度の余弦値を持っています

したがって、以下は同等と見なすことができ(以下のベクトルの大きさ)、簡略化できます(1-3)

覚えておいてください:cos = Base / Hypotenuse

0. cosine_triangle_2                   = cosine_triangle_1
1. rayDirX/sqrt(rayDirX^2 + rayDirY^2) = 1/deltaDistX
2. (rayDirX*deltaDistX)^2              = rayDirX^2 + rayDirY^2
3. deltaDistX                          = sqrt(1+ rayDirY^2/rayDirX^2)

同様にの方程式をdeltaDistY導き出すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.