В задании по трассировке лучей, которое я выполняю, я должен вычислить 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;
}