Как создать систему координат, заданную только вектором?
(левша, правша, местное или другое пространство)
Я ищу вычислить алгоритм локальной системы координат, учитывая только один вектор:
Причина:
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 ..
}
Предположим, что наименьший компонент (в абсолютном значении) данного вектора Zz
, Затем определите X
быть (Zy, -Zx, 0)
, а также Y = (-Zx.Zz, -Zy.Zz, Zx²+Zy²)
,
Если самый маленький компонент не Zz
, адаптируйте формулы соответственно.
Обратите внимание, что эти векторы ненормализованы, и я не смотрел на руки.
Вы можете использовать двойной кроссворк.
Просто используйте концепцию вращения координат.
Первоначально у вас есть один вектор (предположим, в направлении х)
Теперь поверните этот вектор на 90 градусов, и вы получите вторую ось (ось Y, если повернуть на 90 градусов в плоскости XY)
Точно так же получить третью ось, вращая в соответствующей плоскости.