Запутанный вопрос о матрице проекции мировоззрения для трассировки лучей с использованием XNA - PullRequest
2 голосов
/ 27 июля 2011

Поэтому я решил переписать мой старый трассировщик лучей, написанный на C ++, и сделать это на C #, используя среду XNA.

У меня все еще есть моя старая книга, и я могу следить за примечаниями, однако я смущен некоторыми идеями, и мне было интересно, сможет ли кто-нибудь сформулировать это красиво.


    for each x pixel do
        for each y pixel do
        //Generate Ray
        //1 - Calculate world coordinates of current pixel
           //1.1 Calculate Normalized Device coordinates for current pixel 1- to -1 (u, v) 
           u = (2*x/ WIDTH) - 1 ;
           v = (2*y/HEIGHT) - 1 ;
           Vector3 rayDirection = -1*focalLength + u'*u + v'*v


В приведенном выше коде u 'и v' - это нормальное основание, рассчитанное для данной камеры (я знаю, что одни и те же имена приводят в замешательство)

Если я следую книге и делаю так, как она выражается, это работает. Однако я пытаюсь использовать XNA и путаюсь в том, как выполнять те же действия, но с использованием матриц.

Итак, я попытался заменить следующие шаги кодом XNA


    class Camera
        {
           public Camera(float width, float height)
           {
            AspectRatio = width/height;
            FOV = Math.PI / 2.0f;
            NearPlane = 1.0f;
            FarPlane = 100.0f;
            ViewMatrix = Matrix.CreateLookAt(Position, Direction,this.Up);
            ProjectionMatrix=Matrix.CreatePerspectiveFieldOfView(FOV,
                                              AspectRatio,NearPlane,FarPlane); 
           }
        }

Именно в этот момент я запутался в порядке операций, которые я должен применить, чтобы получить вектор направления для любого пикселя (x, y)?

В моей голове я думаю: (u, v) = ProjectionMatrix * ViewMatrix * ModelToWorld * Вершина (в пространстве модели)

Поэтому имело бы смысл, что

Вершина (в мировом пространстве) = Инверсия (ViewMatrix) * Инверсия (ProjectionMatrix) * [u, v, 0]

Я также вспомнил кое-что о том, как матрицу представления можно транспонировать и инвертировать, поскольку она ортонормирована.

Ответы [ 2 ]

0 голосов
/ 29 июля 2011

Причина NDC в том, что вы можете отобразить высоту / ширину изображения в пикселях на изображение произвольного размера (не обязательно 1: 1). По сути, я понял следующее:

  1. Выхотите преобразовать пиксель X & Y в равномерный прямоугольник от -1 до 1 (по существу, центрируя камеру в пределах рамки просмотра)
  2. Выполните матрицу обратной проекции, в которой используются FOV, формат изображения и ближняя плоскость для размещения пикселяв координатах НДЦ) в координаты мирового пространства
  3. Выполнить инверсию матрицы камеры, чтобы поместить координаты относительно камеры в мировом пространстве
  4. Вычислить направление
0 голосов
/ 27 июля 2011

Нет необходимости использовать матрицы для трассировки лучей.Перспективная проекция просто выпадает из системы.Это одно из преимуществ трассировки лучей.

Ваши комментарии тоже сбивают с толку.

// 1 - Рассчитать мировые координаты текущего пикселя //1.1 Рассчитать нормализованные координаты устройства для текущего пикселя 1- до-1 (u, v)

NDC не играет никакой роли в трассировке лучей, поэтому я не знаю, о чем вы здесь говорите.Все, что вы делаете с этим кодом u, v - это вычисление направления луча на основе виртуальной сетки пикселей, которую вы настроили в мировом пространстве.тогда вы собираетесь проследить луч в сцену и посмотреть, пересекается ли он с чем-либо.

На самом деле вам не нужно сейчас беспокоиться о различных обрядах пространства.Просто поместите все в мировые координаты и назовите это днем.если вы хотите создавать сложные модели (преобразования моделей, такие как масштабирование, вращение и дерьмо), может потребоваться преобразование модель-> мир, но когда вы впервые начинаете писать трассировщик лучей, вам не нужно беспокоиться об этом.

если вы хотите использовать XNA, вы можете использовать этот класс камеры, но, как некоторые из членов, будут бесполезны.т. е. матрицы и ближняя и дальняя плоскости.

...