RayTracing: когда нормализовать вектор? - PullRequest
4 голосов
/ 29 июля 2011

Я переписываю свой трассировщик лучей и просто пытаюсь лучше понять некоторые его аспекты.

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

Что меня смущает, так это когда мне нужно нормализовать векторы направления?

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

Нормализованный вектор в том же направлении с единицей длины 1? Так что мне непонятно, когда это необходимо?

Спасибо

Ответы [ 5 ]

5 голосов
/ 11 августа 2011

Вам никогда не нужно нормализовать вектор, если вы не работаете с углами между векторами или если вы не вращаете вектор.

Вот и все.

В первом случае все ваши функции триггера требуют, чтобы ваши векторы приземлялись на единичный круг, что означает, что векторы нормализованы. В последнем случае вы делите величину, вращаете вектор, проверяете, что он остается единицей, а затем умножаете величину обратно. Нормализация идет только с территорией.

  • Если кто-то скажет вам, что система координат определяется n единичными векторами, знайте, что i-hat, j-hat, k-hat и т. Д. Могут быть любым произвольным вектором (s) ) из любой длины и направления, при условии, что ни один из них не параллелен. Это сердце аффинных преобразований.

  • Если кто-то пытается сказать вам, что скалярное произведение требует нормализованных векторов, покачайте головой и улыбнитесь. Точечному произведению нужны только нормализованные векторы, когда вы используете его, чтобы получить угол между двумя векторами.

Но не упрощает ли нормализация математику?

Не совсем - он добавляет вычисление величины и деление. Числа между 0..1 не отличаются от чисел между 0..x.

Сказав это, вы иногда нормализуетесь, чтобы хорошо играть с другими. Но если вы обнаружите, что нормализуете векторы из принципа, прежде чем вызывать методы, подумайте об использовании флага, прикрепленного к вектору, чтобы сохранить себе шаг. Математически, это неважно, но практически, это может иметь огромное значение в производительности.

Итак, еще раз ... все дело в вращении вектора или измерении его угла относительно другого вектора. Если вы этого не делаете, не тратьте циклы.

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

tl; dr: нормализованные векторы упрощают вашу математику.Они также уменьшают количество очень трудно диагностируемых визуальных артефактов на ваших изображениях.

Нормализованный вектор в одном направлении с единицей длины 1?Так что мне неясно, когда это необходимо?

Вы почти всегда хотите, чтобы все векторы в трассировщике лучей были нормализованы.

Простейший пример - это тест пересечения: гдепопадает ли прыгающий луч на другой объект.

Рассмотрим луч, где:

p(t) = p_0 + v * t

В этом случае точка в любом месте вдоль этого луча p(t) определяется как смещение от исходной точки.p_0 и смещение вдоль определенного направления v.Для каждого приращения параметра t результирующее p(t) будет перемещать еще одно приращение длины, равное длине вектора v.

Помните, вы знаете p_0 и v.Когда вы пытаетесь найти точку, где этот луч в следующий раз попадает на другой объект, вы должны решить для этого t.Очевидно, что удобнее, если не всегда очевидно, использовать в этом представлении нормализованный вектор v.

Однако этот же вектор v используется в расчетах освещения.Представьте, что у нас есть другой вектор направления u, который указывает на источник освещения.Для очень простой модели затенения мы можем определить источник света в определенной точке как произведение точек между этими двумя векторами:

L(p) = v * u

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

Теперь, помните, что другой способ написания этого точечного произведения - произведение величин векторов на косинусугла между ними:

L(p) = ||v|| ||u|| cos(theta)

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

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

Я отвечу на противоположный вопрос. Когда вам НЕ нужно нормализовать? Почти все вычисления, связанные с освещением, требуют единичных векторов - тогда скалярное произведение дает вам косинус угла между векторами, который действительно полезен. Некоторые уравнения все еще могут справляться, но становятся более сложными (по существу, выполняют нормализацию в уравнении), что оставляет в основном тесты на пересечение.

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

Вы можете подумать о нормализации вектора направления ПОСЛЕ выполнения некоторой работы, которая не требует этого - возможно, у вас есть структура ускорения, которую можно обходить без нормализованного вектора. Но это тоже не актуально, потому что в конце концов луч попадет на что-то, и вы захотите сделать с ним расчет освещения / затенения. Так что вы можете также нормализовать их с самого начала ...

Другими словами, любой конкретный расчет может не требовать нормализованного вектора направления, но данный вектор направления почти наверняка необходимо будет нормализовать в какой-то момент процесса.

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

Необходимо нормализовать вектор направления всякий раз, когда вы используете его в некоторой математике, на которую влияет его длина.

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

Например, при использовании интерполированной нормали к треугольнику.Здравый смысл говорит вам, что, поскольку нормали в вершинах равны normal , векторы, которые вы получите путем интерполяции, тоже будут.Так много для здравого смысла ... правда в том, что они будут на короче , если только они не все случайно указывают в одном направлении.Это означает, что вы будете затенять треугольник слишком темным (что еще хуже, эффект тем сильнее, чем ближе источник света подходит к поверхности, что является ... очень забавным результатом).

Другой примергде вектор может или не может быть нормализован, является перекрестным произведением, в зависимости от того, что вы делаете.Например, при использовании двух перекрестных произведений для создания ортонормированной базы, вы должны хотя бы один раз нормализовать (хотя, если вы делаете это наивно, вы в конечном итоге будете делать это чаще).
Если вас волнует только направлениерезультирующий «вектор вверх» или относительно знака нормализовать не нужно.

0 голосов
/ 26 марта 2012

Векторы используются для хранения двух концептуально различных элементов: точек в пространстве и направлений:

  • Если вы сохраняете точку в пространстве (например, положение камеры, начало луча, вершины треугольников), которую вы не хотите нормализовать, потому что вы изменяете значение вектора, и потерять определенную позицию.
  • Если вы сохраняете направление (например, камеру вверх, направление луча, нормали объекта), которое вы хотите нормализовать, потому что в этом случае вас интересует не конкретное значение точки, а направление ее представляет, так что вам не нужна величина. Нормализация полезна в этом случае, потому что она упрощает некоторые операции, такие как вычисление косинуса двух векторов, что можно сделать с помощью скалярного произведения, если оба нормализуются.
...