Генерация случайной точки на 2D диске в 3D пространстве с заданным нормальным вектором


Существует ли простой и эффективный метод генерации случайной (равномерно распределенной) точки на диске, "висящем" в трехмерном пространстве? Диск определяется его нормалью.

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

До сих пор я пытался создать трехмерный единичный вектор и спроецировать его на плоскость диска, что гарантирует, что точка находится внутри диска, но не равномерно распределенный. Я также попытался масштабировать сгенерированный вектор в соответствии с некоторой функцией его длины, но я не мог получить равномерное распределение обратно независимо. У меня была идея, которая включала в себя создание 2 векторов, перпендикулярных друг другу и нормали, чтобы определить локальную систему координат. Затем я мог бы сгенерировать точку на единичном диске, как в 2D, и преобразовать результат обратно в глобальную систему координат. Это, кажется, было бы довольно эффективно, так как это включает в себя некоторые предварительные вычисления (что меня полностью устраивает) и только простые вычисления после этого (это для raytracer, так что это будет происходить много). Проблема в том, что я не знаю, как надежно вычислить базисные векторы локальной системы координат, избегая при этом возможных проблем, таких как коллинеарность.

Любая помощь очень ценится.

1 2

1 ответ:

Простой способ вычислить ортогональные базисные векторы u, v для плоскости с нормалью n = (a, b, c) - найти компонент с наименьшим абсолютным значением и сделать u ортогональным этой компоненте; остальное в значительной степени следует. Например, если первая составляющая имеет минимальное абсолютное значение, то можно выбрать следующие базисные векторы:

u = (0, -c, b)                //  n·u = -bc+cb = 0

v = (b²+c², -ab, -ac)         //  n·v = ab²+ac²-ab²-ac² = 0, u·v = abc-abc = 0