Построить ортонормированную базу, заданную только одним вектором в 3d - PullRequest
1 голос
/ 13 октября 2011

Я ищу простой и эффективный способ решения следующей проблемы:

У меня есть один вектор в 3d, и я хочу получить ортонормированную базу ( x , y , z ), где один из базовых векторов (скажем, x ) является заданным вектором.Поэтому я ищу два вектора, перпендикулярных друг другу, которые также перпендикулярны моему заданному вектору.

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2013

Чтобы избавиться от тибурского if, вы можете получить небольшое улучшение, используя дешевый (er) mul + float cast

y = x ^ u
y.z += float(y==0); // this changes a zero-vector into (0,0,1)
z = x ^ y

Выполнение векторного сравнения после перекрестного продукта дает более стабильное решение, чем проверка, если u == x, приведение с плавающей запятой зависит от вашей архитектуры, но работает на большинстве компиляторов / платформ.

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

0 голосов
/ 13 октября 2011

Давайте назовем x ваш единичный вектор. Звоните u = (1,0,0). Если dot(u,x) ~= 0, тогда возьмите u = (0,1,0). Тогда y = x ^ u и z = x ^ y.

...