Я пишу трассировщик лучей (в основном для удовольствия), и хотя я написал один в прошлом, и потратил приличное количество времени на поиск, никакие учебники, похоже, не пролили свет на способ вычисления лучей глаз в перспективная проекция без использования матриц.
Я полагаю, что в последний раз, когда я это делал, это было (потенциально) неэффективно вращением векторов глаз x/y
градусов от вектора направления камеры с использованием класса Quaternion
. Это было на С++, и я делаю это на С#, хотя это не так важно.
Псевдокод (при условии, что V * Q = операция преобразования)
yDiv = fovy / height
xDiv = fovx / width
for x = 0 to width
for y = 0 to height
xAng = (x / 2 - width) * xDiv
yAng = (y / 2 - height) * yDiv
Q1 = up vector, xAng
Q2 = camera right vector, yAng
Q3 = mult(Q1, Q2)
pixelRay = transform(Q3, camera direction)
raytrace pixelRay
next
next
Я думаю, что реальная проблема заключается в том, что он имитирует сферическую поверхность экрана, а не плоскую поверхность экрана.
Имейте в виду, хотя я знаю, как и почему использовать кросс-продукты, точечные продукты, матрицы и т.д., мои фактические навыки решения проблем в области математики не являются фантастическими.
Итак, дано:
- Положение камеры, направление и верхний вектор
- Поле зрения
- Экранные пиксели и/или субсэмплирующие подразделения
Каков фактический метод создания луча глаза для координат пикселя x/y для ратрайдера?
Чтобы уточнить: Я точно то, что я пытаюсь вычислить, я просто не очень разбираюсь в 3D-математике, чтобы вычислить его, и никакой код лучей, который я нахожу, кажется, код, который мне нужен, чтобы вычислить луч глаза для отдельного пикселя.