1

基本的なレイトレーサーを実装しているので、理論やその他の実装について読んでいます。これが私が現在参照しているコードです

    template<typename T>
void render(const std::vector<Sphere<T> *> &spheres)
{
    int width = 800, height = 800;//define width and height of the screen
    Vector3d<T> *image = new Vector3d<T>[width * height], *pixel = image;
    T invWidth = 1 / T(width), invHeight = 1 / T(height);
    T fov = 90, aspectratio = width / T(height);//defining field of view angle and aspect ratio
    T fovDist = tan(M_PI * 0.5 * fov / T(180));//Calculates half screen width / perpendicular distance to the camer
a position
    // For each ray crossing a pixel on the view screen.
    for (int y = 0; y < height; ++y) //For each scan line
    {
        for (int x = 0; x < width; ++x, ++pixel) //for each pixel on a scan line
        {
            //Calculate the x position using centre of the pixel. 
           /*By simple trig (width/2)/perpendicular distance to camera = tan (fov/2)
             =>width = distance * tan (fov/2)

           */
            T xx = (2 * ((x + 0.5) * invWidth) - 1) * fovDist * aspectratio;
            T yy = (1 - 2 * ((y + 0.5) * invHeight)) * fovDist;//Calculate the y position
            Vector3d<T> raydir(xx, yy, -1);
            raydir.normalize();
            *pixel = trace(Vector3d<T>(0), raydir, spheres, 0);
        }
    }

私が理解していることのコメントを入れていますが、xx と yy の計算に固執しています。

単純な三角法で幅 = 2 * (カメラからビュー プレーンまでの垂直距離) * tan (fov / 2) であることを理解しています。しかし、T xx と T yy の式がわかりません。

誰かが明確にするのを手伝ってください。

よろしく、モイラ

4

1 に答える 1

1

わかりました。これが理解できれば、フレームが XY 平面に平行で、Z=-1 に座っていて、カメラ/目が原点にあることになります。ここで、各ピクセルの中心の X と Y の位置を見つけようとしています。そうですか?

したがってx + 0.5、現在のピクセルの中心にオフセットします。これで問題ありません。ピクセルの総数で割ると、フレーム全体のパーセンテージが得られます: 良好です。2 を掛けてから 1 を引くと、-1 から 1 の範囲になります。これは、中心から左への 100% と、中心から右への 100% にそれぞれ対応します (またはその逆)。 -逆)。ここで、幅の半分 (fovDist) を掛けると、左半分の幅と右半分の幅の間のどこかに配置されます。それで、それはすべて良いことです。最後に、fovDist は実際には高さの半分であり、necc ではないため、アスペクト比を掛けます。半分の幅。したがって、縦横比が 2:1 の場合は、高さよりも幅が広い必要があるため、ピクセルを水平方向に広げたいと考えています。

yy を同じように設定しましたが、スキャンラインは通常逆方向に進むため、反転しています。それで、それもうまく見えます。

それで、それは機能しますか?あなたはそれを理解しようとしているだけですか?それとも正しく動作していませんか?正しく動作しない場合、代わりにどのような動作が見られますか?

正しく動作しない場合、私が飛び出す唯一のことは、さまざまな数値型のすべてです。たとえば、変数invWidthinvHeight変数は両方とも整数 1 を何かで除算します。C++ がこれをどのように処理したか思い出せませんが、ここで整数除算によって 0 に切り捨てられている可能性があります。同様に、xx と yy の式には多くの整数があります。コンパイラが問題なく動作するかどうかはわかりませんが、正しく動作しない場合は、そこから始めます。

于 2012-11-30T16:30:04.073 に答える