ПрограммированиеФорумОбщее

Преобразование нормали в кватернион ориентации.

#0
23:39, 9 окт 2016

Вобщем нужно что-то быстрее, чем преобразование в матрицу LookAt и извлечения кватерниона.
Натыкался на какие-то примеры с форума, но чет ничего не подходит.

#1
0:23, 10 окт 2016

zeleniy5
Google: quaternion from two vectors

#2
1:54, 10 окт 2016

-Eugene-
У меня вращение объекта, а не направление движения.
Таргет в (0,0,0), реализации через Cross дают кватернион, без вращения.

#3
9:18, 10 окт 2016

zeleniy5
Ты не можешь однозначно перевести нормаль в кватернион, потому что у них разное число степеней свободы.
Нужна еще какая-то информация. Если ты ищешь кватернион для камеры, попробуй взять вращение от (0, 0, 1) до lookAt или от (0, 0, -1) до lookAt
Но не факт, что это будет именно тот поворот, что ты хочешь.

#4
11:25, 10 окт 2016
#define X_AXIS vec3(1, 0, 0)
#define Y_AXIS vec3(0, 1, 0)
#define Z_AXIS vec3(0, 0, 1)

vec3 vec3::axis() const {
  float ax = fabsf(x);
  float ay = fabsf(y);
  float az = fabsf(z);
  return ax < ay ? (ax < az ? X_AXIS : Z_AXIS) : (ay < az ? Y_AXIS : Z_AXIS);
}

quat::quat(const vec3 &from, const vec3 &to) {
  float c = from.dot(to);
  float d = sqrtf(from.length2() + to.length2());
 
  if (c / d == -1.0f) {
    xyz = from.cross(from.axis());
    w = 0.0f;
  } else {
    xyz = from.cross(to);
    w = c + d;
  }
  normalize();
}
#5
5:04, 13 окт 2016

XProger
За коды спасибо конечно, но как я понял это не то что мне нужно было.

-Eugene-
Получилось только вокруг Y оси вращать, в сторону меньшего поворота, а вот наклоны не вышло также вращать, было принято решение ограничить наклон (pi/2, 3pi/2),
такой вариант для меня покатит.

ПрограммированиеФорумОбщее

Тема в архиве.