在我正在進行的光線追蹤任務中,我必須計算從相機拍攝的光線的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;
}
請您提供表示計算結果並示出某些輸入,其中這兩種方法的發散兩種方式的完整的可運行的例子。它會消除你的問題中的許多含糊之處。 – NPE
除非您可以顯示兩種不同的代碼片段來重現與您有關的任何行爲,否則很難提供幫助 –
當我發現它需要時,我花了幾分鐘時間用代碼對其進行更新;在那裏有人已經投下了這個問題:( – legends2k