В исходниках которые я нашел повороты работают некорректно(искажение).
Это С++ но вроде понятно.
Вот реализация Кватерниона.
Мне кажется ошибка здесь
- Код: Выделить всё
//Это собственно получение Кватерниона.
void set( T xrot, T yrot, T zrot ) {// на вход получаем углы поворота и только(такой формат файла)
T angle;
T sx, sy, sz, cx, cy, cz;
angle = zrot * T( 0.5 );
sz = ( T )sin( angle );
cz = ( T )cos( angle );
angle = yrot * T( 0.5 );
sy = ( T )sin( angle );
cy = ( T )cos( angle );
angle = xrot * T( 0.5 );
sx = ( T )sin( angle );
cx = ( T )cos( angle );
x = ( T )( sx*cy*cz-cx*sy*sz );// что здесь считается я не понял(оъясните если это возможно)
y = ( T )( cx*sy*cz+sx*cy*sz );// т.к. q = [x1,x2,x3,x4] = [scalar,(vector)]
z = ( T )( cx*cy*sz-sx*sy*cz );
w = ( T )( cx*cy*cz+sx*sy*sz );
normalize(); // особенно здесь
};
//------------------------------------------------------------------------------------------------------------------------
void normalize() {
const T s = T( 1 ) / ( T )sqrt( x*x + y*y + z*z + w*w );
w *= s;
x *= s;
y *= s;
z *= s;
}
но Кватернион создается так:
1.s = cos(angle/2) скляр мы не трогаем, а здесь он участвует в расчетах
2.v = (x,y,z) * sin(angle/2) / |(x,y,z)| хотя должны быть (x,y,z) т.е. только вектор
3. q = [s,v].
реализация slerp вроде правильная.
Совсем забуксовал:(