Как рассчитать систему координат из одного вектора?

Как создать систему координат, заданную только вектором?
(левша, правша, местное или другое пространство)

введите описание изображения здесь

Я ищу вычислить алгоритм локальной системы координат, учитывая только один вектор:

Причина:

1) Может быть, Z — нормаль к поверхности, тогда вектор X и Y будет касательным, а вектор — касательным

2) Другая причина для трассировки лучей: выборка источника света. С учетом точки пересечения построить локальную систему координат из этой точки, а затем проследить луч до формы света.

Vector3 Z = {0.0f, 0.0f, 1.0f}; // given
// fill x and y
CreateXHandedCoordinateSystem(Vector3* X, Vector3* Y, const Vector3& Z) {
// implementation goes here..
// evaluate algorithm
// calculate X
// Y = cross(X, Z) or something ..
}

3

Решение

Предположим, что наименьший компонент (в абсолютном значении) данного вектора Zz, Затем определите X быть (Zy, -Zx, 0), а также Y = (-Zx.Zz, -Zy.Zz, Zx²+Zy²),

Если самый маленький компонент не Zz, адаптируйте формулы соответственно.

Обратите внимание, что эти векторы ненормализованы, и я не смотрел на руки.

2

Другие решения

Вы можете использовать двойной кроссворк.

  1. Возьмем ваш вектор (назовем его локальным X), возьмем произвольный вектор вверх (обычно вектор вверх) и вычислим перекрестное произведение. Это будет ваш местный Z.
  2. Возьмите ваш локальный X и местный Z и рассчитайте перекрестное произведение, это будет ваш местный Y
2

Просто используйте концепцию вращения координат.

Первоначально у вас есть один вектор (предположим, в направлении х)

Теперь поверните этот вектор на 90 градусов, и вы получите вторую ось (ось Y, если повернуть на 90 градусов в плоскости XY)

Точно так же получить третью ось, вращая в соответствующей плоскости.

0
По вопросам рекламы [email protected]