レイトレを始めたいのでお勉強。 1.レイの定義

 レイトレを始めたいのでまずはレイの定義をしたいと思います。

レイトレはいろんな手法があるみたいで、それによってレイの定義も様々あるのかもしれませんが、最も基本的なレイを考えたいと思います。

 

レイの定義には様々あると思いますが、まずは最もプリミティブな表現を考えます。

カメラの座標を(0,0,0)として、ある点(a,b,c)を通るような光を考えます。このときのレイの方向は(a,b,c)-(0,0,0)でそのまま(a,b,c)になります。

 

f:id:nilgiri-sgt:20190420134916p:plain

 

もしz= cの位置に,面xyに平行にスクリーンを置いたとすれば、このときのレイはスクリーン上のa,bを通ってくれるわけです。

 

このスクリーンとカメラの距離によって視野角があとから決められます。なので、このようなレイの定義をすると、スクリーン上の点(x,y)を描画するのに使うレイは

 

ray = normalize vec3 (screen.x,scree.y,D)

 

となります。このときDの値は任意に与えることができて、これによって視野角が変わってきます。

 

 

これに対して視野角を予め決めてやる方法もあります。このときは視野角を決めることによってカメラとスクリーンの位置が定まります。視野角を2θとしましょう(半分の角度を使うと計算が楽なので)。すると、スクリーンの幅に対してカメラの位置が決まります。

 

f:id:nilgiri-sgt:20190420140645p:plain

スクリーンの幅がr sin(θ)に対して、r cos(θ)だけ後ろにカメラをおけば視野角2θでスクリーンを写すことができるというわけです。長方形スクリーンのときは横の長さを基準にするのが普通な気がします。

 

さて、この位置にカメラを置いたとしてスクリーンの任意の位置(a,b)を通るようなレイの定義は、スクリーンの座標が -1 から 1 を取りうるとすれば、

 

r sin(θ) = 1

であるため、r = 1/sin(θ)

ゆえに、カメラの座標はスクリーンが(0,0,0)を中心にすると考えると、

 

(0,0,-cos(θ)/sin(θ))

 

ここでカメラ位置からスクリーンの任意の位置(a,b,0)へのベクトルは引き算して

 

(a,b,cos(θ)/sin(θ))

 

形を整えて規格化すれば

 

normalize( vec3( a*sin(θ),b*sin(θ),cos(θ) ) )

 

になります。次回はカメラの向いている向きによってレイの方向を変えることを考えてみたいと思います。