2

私はレイトレーシングでカメラに完全に固執しました。私の計算を見て、エラーがどこにあるかを指摘してください。左利きの座標系を使用しています。

x、y //範囲[0..S)x [0..S)//ピクセル座標

それでは、ピクセル座標をカメラ平面のパラメトリック座標に変換しましょう。

xp = x/S * 2 – 1; 
yp = y/S * 2 – 1;

xp、yp//範囲[-1..1]x [-1..1]

カメラベースの計算:

//eye - camera position
//up - camera up vector
//look_at - camera target point

vec3 w = normalize(look_at-eye);
vec3 u = cross(up,w);
vec3 v = cross(w,u);

したがって、光線の方向は次の座標である必要があります。

vec3 dir = look_at – eye + xp*u + yp*v;
ray3 ray = {eye, normalize(dir)};
4

1 に答える 1

2

私は間違いがここにあると思います:

vec3 dir = look_at – eye + xp*u + yp*v;

画像平面は法線ベクトルを持ちw、目と視点の間にあるか(レイトレーサーでより一般的な方法)、目の後ろにある(実際のピンホールカメラをより厳密にモデル化する)必要があります。それでは、スカラーを作成しましょうzoom_factor。正の数は平面を目の前に置き、負の数はそれを目の後ろに置きます(そして画像を反転します)。

したがって、画像平面の中心は次のようになります。

eye + zoom_factor*w

(xp, yp)したがって、画像平面上の点は次のようになります。

eye + zoom_factor*w + xp*u + yp*v

ここで、目からこのイメージ平面上のこのポイントまでの方向を指定します。

vec3 dir = eye + zoom_factor*w + xp*u + yp*v - eye;

sはキャンセルされるため、次のeyeように簡略化されます。

vec3 dir = zoom_factor*w + xp*u + yp*v

これはxpypがそれぞれ(-0.5、0.5)のような範囲にあることを前提としています。(0、0)は、この配置では画像平面の中央であることに注意してください。

于 2012-06-17T15:07:05.717 に答える