Я пишу трассировщик лучей (в основном для удовольствия), и хотя я написал один в прошлом, и потратил приличное количество времени на поиск, никакие учебники, похоже, не пролили свет на способ вычисления лучей глаз в перспективная проекция без использования матриц.
Я полагаю, что в последний раз, когда я это делал, это было (потенциально) неэффективно вращением векторов глаз 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-математике, чтобы вычислить его, и никакой код лучей, который я нахожу, кажется, код, который мне нужен, чтобы вычислить луч глаза для отдельного пикселя.
 

