1

私はレイトレーサーを書いています(それが違いを生む場合は左手座標を使用します)。原則を独学するためなので、OpenGL や被写界深度などの複雑な機能は (まだ) 使用していません。カメラの位置と向きは任意です。location、 、look_at、およびの 3 つのベクトルでそれらを示します。これらは同等の POV-Ray ベクトルskyのように動作します。その「フィルム」にも と があります。(長さは からまでの距離によって暗示されます。)widthheightfocalpositionlook_at

私の問題は、光線をキャストする方法がわからないことです。光線がどこに到達するかを示すvxとの2 つの量があります。vyどちらも -1 から 1 まで変化します。どちらも -1 の場合、カメラの位置から「フィルム」の左上隅に光線をキャストしています。両方とも 1 の場合、右下。どちらも 0 の場合は中央。そして残りは明らかです。

私は光線の方程式を導出するためのベクトル演算に精通していません。その方法の説明をいただければ幸いです。

4

1 に答える 1

1

何をする必要があるかについては、すでに十分に説明しました。視野は、カメラと光線を放つ「フィルム」との間の距離によって決まります。カメラがフィルムから離れれば離れるほど、視野は狭くなります。

カメラが指しているビットマップ画像としてフィルムを想像してください。カメラをビットマップから 1 ユニット離して配置するとします。次に、ビットマップの各ピクセルにレイをキャストする必要があります。

ベクトルは非常に単純です。カメラの位置を (0,0,0) に置き、ビットマップ フィルムをその中心 (0,0,1) でそのすぐ前に置くと、右下の光線は - tada - (1, 1,1)、左下のものは (-1,1,1) です。

つまり、右下と左下の差は (2,0,0) です。

水平方向のビットマップ解像度が 1000 であると仮定すると、最終的なピクセルを次のように反復処理できます。

width = 1000;
cameraToBottomLeft = (-1,1,1);
bottomLeftToBottomRight = (2,0,0);

for (x = 0; x < width; x++) {
    ray = cameraToBottomLeft + (x/width) * bottomLeftToBottomRight;
    ...
}

それが明らかな場合は、ラインに同等の外部ループを追加するだけで、必要なすべての光線が得られます。

次に、カメラからフィルムまでの距離、および水平解像度と垂直解像度に適切な変数を追加できます。それが完了したら、マトリックス変換を使用して、ルック ベクトルとアップ ベクトルの変更を開始できます。

コンピュータ グラフィックスについて詳しく知りたい場合は、入門書が大いに役立ちます。私は大学でこれを使用しましたが、気に入ったと思います。

于 2009-11-09T21:51:36.197 に答える