2016-09-26 4 views
-1

私はレイトレーサに取り組んでいます。私のカメラの方向ベクトルがベクトルと平行である場合を扱うことができないようです0,1,0)。y軸に平行なカメラ方向をレイレイラに対応させるには

カメラのベクトルを計算する方法には結びついていると思いますが、回避策を見つけることができません。ここで

は、私はそれを行う方法です。

cam_up = vector_cross(cam_dir, {0, 1, 0}); 
camp_right = vector_cross(cam_right, cam_dir); 

誰かが私を啓発することができますか?

+1

プログラミング言語タグを追加する必要があります。 – Laurel

+0

とにかくその方向でどの方向を選択したいですか? – harold

+0

私は分かりません。方向を選択することはどういう意味ですか? –

答えて

1

1つのcameraOutベクトルから直交軸を計算する正しい式があります。しかしながら、この公式は、カメラの方向に垂直な平面内の任意の方向であり得るカメラロールを説明しないことに留意されたい。これは、望ましくない動作があるようにカメラをポール(y軸)を横切って動かすときに明らかになります(正しく目標を設定しますが、ロールが望ましくないことは間違いありません)。

詳細については、gimbal lockを参照してください。

ロール自体は実際には間違いではありませんが、現実にはこのカメラの動きがスムーズになり、正しく表示されます(方向が0,1,0になると突然フリップまたは回転するのではなく) 。これはcameraOut軸回りの回転で、理想的には直前のcameraAlongを基準にする必要があります。これは、正しいロール(または正しいロールを知覚する)を維持するためには、前のフレームからのカメラPOSE(位置と方向)を考慮し、ロールが緩和されることを保証する必要があることを意味します。もちろん、カメラが動かない(すなわち、静止したカメラ位置のフレームをレンダリングする)場合、以前のカメラ状態を持たないので、位置を計算することができず、その代わりにシーン定義の一部として明示的に定義しなければならない。

個人的に私はカメラのための直交軸全体を保存しますので、向きとロールは常に明確に定義されます。これは完全性のためだけです。正に軸全体を格納する必要はありません.2つのベクトルcameraOutとcameraAlong(3つ目はcameraUp)で十分です。 cameraAlongは、座標系の譲渡に依存します(例えば、左手座標系の最初のカメラ位置の位置(0,0,0))、カメラのアロンの方向はビューアに対して右方向に、右手のシステムではcameraAlongは逆の方向になり、cameraUpとcameraOutは両方の座標系で同じになります)。

これが役に立ちます。

P.Sこれは、レイトレーシング特有ではなく、同じ原則がOpenGL/DirectXまたは任意の3D表現に適用されます。

関連する問題