Arhn - архитектура программирования

Как использовать матрицу lookAt для вычисления луча при трассировке лучей?

Насколько я понимаю, метод «lookat» — один из самых простых способов разместить/повернуть камеру в сцене. Поэтому я реализовал матрицу, доступную на (https://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/lookat-function) в коде моей трассировки лучей, но я понятия не имею, как использовать его для вычисления лучей.

В основном то, что я делаю, это размещаю камеру на отрицательных значениях Z, посылаю луч на положительное значение Z и выбираю пиксель, повторяющий X и Y моей плоскости обзора. Это легко, потому что плоскость обзора находится перед камерой, и мне нужно просто назначить X и Y моих итераций назначению луча X и Y. Однако я хотел бы иметь возможность направлять луч в любую часть пространства.

Не могли бы вы помочь мне понять, как это сделать?

Спасибо!

Что я делаю в основном:

{        
    double deg = 50.;
    double rad = deg / (180.0 / M_PI);
    double distance = (WIDTH / 2) * (cotan(rad / 2));
    ray.orig.x = HEIGH / 2.0;
    ray.orig.y = WIDTH / 2.0;
    ray.orig.z = -distance;
    y = -1;
    while (++y <= HEIGH)
    {
        x = -1;
        while (++x <= WIDTH)
        {
            ray.dest.x = x - ray.orig.x;
            ray.dest.y = y - ray.orig.y;
            ray.dest.z = 0. - ray.orig.z;
            ray.dest = ve_normalize(&ray.dest);
            check_objects(c, &ray, 0);
            add_diffuse_light(c);
            put_pixel(c, &x, &y);
        }
    }
}

Функции для обработки матрицы просмотра:

t_lookat    lookati(t_vector *from, t_vector *to)
{
    t_lookat    lookat;
    t_vector    fo;
    t_vector    ri;
    t_vector    up;

    t_vector tmp;
    tmp.x = 0; tmp.y = 1; tmp.z = 0;
    fo = ve_subtraction(from, to);
    fo = ve_normalize(&fo);
    ri = ve_cross(&tmp, &fo);
    ri = ve_normalize(&ri);
    up = ve_cross(&fo, &ri);
    up = ve_normalize(&up);

    lookat.ri.x = ri.x;
    lookat.ri.y = ri.y;
    lookat.ri.z = ri.z;
    lookat.up.x = up.x;
    lookat.up.y = up.y;
    lookat.up.z = up.z;
    lookat.fo.x = fo.x;
    lookat.fo.y = fo.y;
    lookat.fo.z = fo.z;
    lookat.fr.x = from->x;
    lookat.fr.y = from->y;
    lookat.fr.z = from->z;

    return(lookat);
}

t_vector    orientate(t_vector *a, t_vector *from, t_vector *to)
{
    t_lookat k;

    k = lookati(from, to);
    t_vector orientate;

    orientate.x = a->x * k.ri.x + a->y * k.up.x + a->z * k.fo.x + a->x * k.fr.x;
    orientate.y = a->x * k.ri.y + a->y * k.up.y + a->z * k.fo.y + a->x * k.fr.y;
    orientate.z = a->x * k.ri.z + a->y * k.up.z + a->z * k.fo.z + a->x * k.fr.z;

    return(orientate);
}
13.06.2019

  • Преобразуйте луч с помощью обратной матрицы просмотра. 14.06.2019
  • Не могли бы вы привести более конкретный пример? 14.06.2019
  • Также дайте определения t_vector и, что более важно, t_lookat. 14.06.2019
  • см. Отражение и преломление невозможно без рекурсивной трассировки лучей? найдите там вершинный шейдер ray_dir - это направление луча, а tm_eye содержит < href="https://stackoverflow.com/a/28084380/2521214">преобразование камеры, а pos - входная вершина, представляющая положение пикселя на экране в диапазоне <-1,+1>. Остерегайтесь вдобавок ко всему, что применена перспективная проекция... 14.06.2019

Ответы:


1

Спасибо, ребята, наконец-то я решил проблему, прочитав это руководство (https://steveharveynz.wordpress.com/2012/12/20/ray-tracer-part-two-creating-the-camera), который предлагает нормализовать координаты (например, диапазон пикселей пользователя «Спектр») без использования матрицы.

Ps.

typedef struct  s_vector
{
    double      x;
    double      y;
    double      z;
}               t_vector;

typedef struct  s_lookat
{
    t_vector    ri; //right vector
    t_vector    up; // up
    t_vector    fo; // foorward
    t_vector    fr; // eye position
}               t_lookat;
14.06.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..