1

カメラの「目」からカメラの目から少し離れた表示面まで光線を生成するコードを作成しました。

R3Ray ConstructRayThroughPixel(...)
{
  R3Point p;

  double increments_x = (lr.X() - ul.X())/(double)width;
  double increments_y = (ul.Y() - lr.Y())/(double)height;
  p.SetX( ul.X() + ((double)i_pos+0.5)*increments_x );
  p.SetY( lr.Y() + ((double)j_pos+0.5)*increments_y );
  p.SetZ( lr.Z() );

  R3Vector v = p-camera_pos;

  R3Ray new_ray(camera_pos,v);
  return new_ray;
}

ulは表示面の左上隅であり、は表示面lrの左下隅です。それらは次のように定義されます。

  R3Point org = scene->camera.eye + scene->camera.towards * radius;
  R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov);
  R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov);
  R3Point lr = org + dx - dy;
  R3Point ul = org - dx + dy;

ここで、orgradiusビューイングプレーンとカメラアイの間の距離であるビューイングプレーンの中心でdxありdy、ビューイングプレーンの中心からのxおよびy方向の変位です。

このConstructRayThroughPixel(...)関数は、目が(0,0,0)にあるカメラに対して完全に機能します。ただし、カメラが別の位置にある場合、画像に必要なすべての光線が生成されるわけではありません。

何がうまくいかない可能性がある提案はありますか?たぶん私の方程式に何か問題がありますか?

助けてくれてありがとう。

4

2 に答える 2

0

これはあなたの問題とは何の関係もないかもしれないクイズです:

これを行うとき:

R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov);
R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov);

rightupベクトルは正規化されていると思いますよね?その場合、あなたはしたくsinないtan。もちろん、fov角度が小さければ大きな違いはありません。

于 2010-03-27T16:13:33.567 に答える
0

私のコードが機能しなかった理由は、x、y、z の値を別々に扱っていたためです。カメラは任意の方向を向いている可能性があり、x 軸を下に向けていた場合、x 座標は同じになり、increments0 が生成されます (これは正しくありません)。代わりに、コーナー ポイント (ポイントは x、y、z 座標を持つ) の補間を行う必要があります。関連する投稿の回答を参照してください:カメラとビュー プレーンが指定された 2D ポイントの 3D 座標

于 2010-04-01T01:27:37.573 に答える