Реализация Кватерниона

Тема в разделе "WASM.GRAPHICS", создана пользователем vito, 17 окт 2005.

  1. vito

    vito New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2004
    Сообщения:
    177
    Нужно загрузить и аннимировать файл MilkS.



    В исходниках которые я нашел повороты работают некорректно(искажение).



    Вот реализация Кватерниона.

    Мне кажется ошибка здесь


    Код (Text):
    1.  
    2. //Это собственно получение Кватерниона.
    3. void set( T xrot, T yrot, T zrot ) {// на вход получаем  углы поворота и только(такой формат файла)
    4.             T angle;
    5.             T sx, sy, sz, cx, cy, cz;
    6.  
    7.             angle = zrot * T( 0.5 );
    8.             sz = ( T )sin( angle );
    9.             cz = ( T )cos( angle );
    10.            
    11.             angle = yrot * T( 0.5 );
    12.             sy = ( T )sin( angle );
    13.             cy = ( T )cos( angle );
    14.  
    15.             angle = xrot * T( 0.5 );
    16.             sx = ( T )sin( angle );
    17.             cx = ( T )cos( angle );
    18.  
    19.            
    20.  
    21.             x = ( T )( sx*cy*cz-cx*sy*sz );// что здесь считается я не понял(оъясните если это возможно)
    22.             y = ( T )( cx*sy*cz+sx*cy*sz );// т.к. q = [x1,x2,x3,x4] = [scalar,(vector)]
    23.             z = ( T )( cx*cy*sz-sx*sy*cz );
    24.             w = ( T )( cx*cy*cz+sx*sy*sz );
    25.  
    26.             normalize(); // особенно здесь
    27.         };
    28. //-------------------------------------------------------------------- ----------------------------------------------------
    29. void normalize() {
    30.             const T s = T( 1 ) / ( T )sqrt( x*x + y*y + z*z + w*w );
    31.            
    32.             w *= s;
    33.             x *= s;
    34.             y *= s;
    35.             z *= s;
    36.         }
    37.  


    но

    1.s = cos(angle/2) скляр мы не трогаем, а здесь он участвует в расчетах

    2.v = (x,y,z) * sin(angle/2) / |(x,y,z)| хотя должны быть (x,y,z) т.е. только вектор

    3. q = [s,v].



    реализация slerp вроде правильная.



    Помогите разобраться, а то уже два дня парюсь.
     
  2. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    vito



    Посмотри здесь: http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_ angles



    Я привык записывать кватернионы в виде матриц, так что могу и ошибаться, но по-моему q = [q<sub>0</sub>,q<sub>1</sub>,q<sub>2</sub>,q<sub>3</sub>] = [w,x,y,z]. А значит и формулы рассчетов правильные.







    А здесь он просто нормализуется. Тебе же кватернионы для вращений нужны, так зачем с длиной возиться.
     
  3. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    Мне тоже кажется, что все расчеты правильные: первые три абзаца это три кватериниона вращения, потом вычисляется конечный кватернион (w,x,y,z) (умножение проверь с ручкой и листочком).

    Еще почитай cтатью на gamedev.ru
     
  4. vito

    vito New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2004
    Сообщения:
    177
    Спасибо. Ошибка есть. Мне кажется.



    Формула разложения кватерниона S(3) не соответствует таковой в релизе(помечено// что здесь считаем я не понял).

    При подстановке правильной формулы - результат еще хуже.



    Проблема здесь следующая три кватерниона(xrot,(1,0,0),yrot... Преообразовать в один для интерполяции.

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

    Буду думать...
     
  5. vito

    vito New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2004
    Сообщения:
    177
    Спасибо за отличные ссылки!

    А то я кучу мат. литературы перелопатил, а две книги по аналитической геометрии всерьез проштудировал.

    И то полезно:)
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
  7. vito

    vito New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2004
    Сообщения:
    177
    _DEN_

    Прямо в яблочко!

    Огромное спасибо!
     
  8. vito

    vito New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2004
    Сообщения:
    177
    Все получилось в лучшем виде!

    Всем огромное спасибо, каждая ссылка дала много полезной информации.

    Stiver

    Великопная ссылка, великолепный сайт.

    Благодаря этому все получилось.



    Еще раз благодарю за помошь.