1

私が行っているレイトレーシングの割り当てでは、カメラからの光線のXオフセットを計算する必要があります。オフセット計算は次のようになります

FovY入力として与えられます。変数を読み取った瞬間に、ラジアンに変換することを思い出しました。

OffsetX = tan (FovX / 2) * ((col - (width / 2)) / (width / 2))

FovX = tan(FovY / 2) * aspect = tan(FovY / 2) * (width / height)

元の方程式に代入してコードを書く:

float OffsetX = tan(FovY / 2.0f) * (width / height) * ((col - (width / 2.0f)) / (width / 2.0f));

間違った引き伸ばされた画像が表示され、それを正しくするのに何時間もかかりました。それは、単純化した後に同じ方程式が機能することを発見した後のことでした。

最終的に再配置された方程式は次のとおりです。

float OffsetX = tan(FovY / 2.0f) * (2.0f / height) * (col - (width / 2.0f));

デバッグを試みましたが、実際、結果は両方の方程式で異なっていました。

ある種の丸め誤差はありますか?誰かが私にこの奇抜さを説明してもらえますか?

#include <cmath>
#include <iostream>
#include <cstdint>

using namespace std;

int main()
{
    const float PI = 3.1415f;
    const uint32_t width = 160, height = 120;
    const auto fovy = (30.0f * (PI / 180.0f));
    size_t j = 0;
    auto alpha = (tan(fovy / 2.0f) * (width / height)) * (((j + 0.5f) - (width / 2.0f)) / (width / 2.0f));
    cout << alpha << endl;
    alpha = tan(fovy / 2.0f) * (2.0f / height) * ((j + 0.5f) - (width / 2.0f));
    cout << alpha << endl;
}
4

1 に答える 1

6

推測させてください:幅と高さは整数です。

あなたがするとき:

(width / height)

結果の小数部分を破棄する整数除算を取得しています。代わりに次のようにします。

((double)width / height)

その場合、2 つの結果はほぼ同じに賭けられます。


余談ですが、式をさらに単純化できます。

tan(FovY / 2.0f) * (2.0f*col - width) / height
于 2012-12-12T20:09:38.690 に答える