在我正在做的光线追踪任务中,我必须计算从相机拍摄的光线的 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;
}