Генерация случайной точки на 2D диске в 3D пространстве с заданным нормальным вектором
Существует ли простой и эффективный метод генерации случайной (равномерно распределенной) точки на диске, "висящем" в трехмерном пространстве? Диск определяется его нормалью.
В идеале я хотел бы избежать ротационных матриц, поскольку я не полностью понимаю их, и я знаю, что у них есть проблемы.
До сих пор я пытался создать трехмерный единичный вектор и спроецировать его на плоскость диска, что гарантирует, что точка находится внутри диска, но не равномерно распределенный. Я также попытался масштабировать сгенерированный вектор в соответствии с некоторой функцией его длины, но я не мог получить равномерное распределение обратно независимо. У меня была идея, которая включала в себя создание 2 векторов, перпендикулярных друг другу и нормали, чтобы определить локальную систему координат. Затем я мог бы сгенерировать точку на единичном диске, как в 2D, и преобразовать результат обратно в глобальную систему координат. Это, кажется, было бы довольно эффективно, так как это включает в себя некоторые предварительные вычисления (что меня полностью устраивает) и только простые вычисления после этого (это для raytracer, так что это будет происходить много). Проблема в том, что я не знаю, как надежно вычислить базисные векторы локальной системы координат, избегая при этом возможных проблем, таких как коллинеарность.Любая помощь очень ценится.
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