4

ゼロからレイ トレーサーを構築しています。私の質問は次のとおりです。カメラ座標を変更すると、球が楕円に変わります。なぜそれが起こっているのかわかりません。

アーティファクトを示すいくつかの画像を次に示します。

Sphere: 1 1 -1 1.0 (Center, radius)
Camera: 0 0 5 0 0 0 0 1 0 45.0 1.0 (eyepos, lookat, up, foy, aspect)

カメラに入る 0 0 5 0 0 0 0 1 0 45.0 1.0

しかし、カメラ座標を変更すると、以下のように球が歪んで見えます。

Camera: -2 -2 2 0 0 0 0 1 0 45.0 1.0

ここに画像の説明を入力

何が悪いのかわかりません。誰かがそれを助けることができれば、それは素晴らしいことです!

imagePlane を次のように設定します。

   //Computing u,v,w axes coordinates of Camera as follows:

 {       
        Vector a = Normalize(eye - lookat);  //Camera_eye - Camera_lookAt
        Vector b = up;    //Camera Up Vector 
        m_w = a;
        m_u = b.cross(m_w);
        m_u.normalize();
        m_v = m_w.cross(m_u);
}

その後、以下に示すように、カメラの位置 (目) から各ピクセルの方向を計算します。

//Then Computing direction as follows:

int half_w = m_width * 0.5;
    int half_h = m_height * 0.5;

double half_fy = fovy() * 0.5;
double angle = tan( ( M_PI * half_fy) / (double)180.0 );

for(int k=0; k<pixels.size(); k++){
    double j = pixels[k].x();       //width
    double i = pixels[k].y();       //height

    double XX = aspect() * angle * ( (j - half_w ) / (double)half_w );
    double YY  =           angle * ( (half_h - i ) / (double)half_h );

    Vector dir = (m_u * XX + m_v * YY) - m_w ;


 directions.push_back(dir);
}

その後:

 for each dir:

    Ray ray(eye, dir);
    int depth = 0;
    t_color += Trace(g_primitive, ray, depth);
4

2 に答える 2

4

たくさん遊んだ後、皆さんのコメントの助けを借りて、rayTracer を適切に作成することができました。返事が遅くなり申し訳ありませんが、このスレッドを締めたいと思います。

したがって、上記のコードは完全に正しいです。私自身の仮定に基づいて (上記のコメントで述べたように)、カメラのパラメーターをそのように設定することにしました。

上記の問題は、カメラの通常の動作です (上記のコメントにも記載されています)。

現在は良好な結果が得られていますが、rayTracer のコーディング中にチェックすべき点がいくつかあります。

  1. FOV と ASPECT RATIO を計算する際は、必ずラジアンから度 (またはその逆) への変換に注意してください。私は次のようにしました:
     double angle = tan((M_PI * 0.5 * fovy) / 180.0);
     double y = angle;
     double x = aspect * angle;

2) 三角形の交点を計算するときは、外積を適切に実装してください。

3) 異なるオブジェクトの交点を使用するときは、カメラからの最小距離にある交点を見つけてください。

これが私が得た結果です: ここに画像の説明を入力

上は非常に単純なモデル (UCBerkeley 提供) で、これを rayTraced しました。

于 2013-04-01T08:46:22.967 に答える
2

これは正しい動作です。広角レンズ付きのカメラを入手し、球体を視野の端近くに置いて写真を撮ります。次に、写真アプリで球体の写真の上に円を描くと、それが円形の投影ではないことがわかります。

この効果は、アスペクトを 1.0 に設定しても画像が正方形ではないという事実によって拡大されます。

いくつかの修正事項:

  • 方向ベクトルは (to - from) です。あなたは (from - to) を持っているので、a は後方を指しています。m_w を減算するのではなく、最後に追加する必要があります。また、この修正により m_u,m_v が 180 度回転し、(j - half_w) が (half_w - j) に変更されます。

  • また、すべてのピクセルとすべての方向をリストに入れることは、単に x,y 値をループするほど効率的ではありません。

于 2013-02-22T18:54:35.863 に答える