Вобщем нужно что-то быстрее, чем преобразование в матрицу LookAt и извлечения кватерниона.
Натыкался на какие-то примеры с форума, но чет ничего не подходит.
zeleniy5
Google: quaternion from two vectors
-Eugene-
У меня вращение объекта, а не направление движения.
Таргет в (0,0,0), реализации через Cross дают кватернион, без вращения.
zeleniy5
Ты не можешь однозначно перевести нормаль в кватернион, потому что у них разное число степеней свободы.
Нужна еще какая-то информация. Если ты ищешь кватернион для камеры, попробуй взять вращение от (0, 0, 1) до lookAt или от (0, 0, -1) до lookAt
Но не факт, что это будет именно тот поворот, что ты хочешь.
#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( ); }
XProger
За коды спасибо конечно, но как я понял это не то что мне нужно было.
-Eugene-
Получилось только вокруг Y оси вращать, в сторону меньшего поворота, а вот наклоны не вышло также вращать, было принято решение ограничить наклон (pi/2, 3pi/2),
такой вариант для меня покатит.
Тема в архиве.