Войти
Sergei ShaykinФорум

Кватернионы в программировании игр. (комментарии)

Страницы: 1 2 Следующая »
#0
18:27, 13 июня 2006

Кватернионы в программировании игр. (комментарии)

Это сообщение сгенерировано автоматически.


#1
18:27, 13 июня 2006

там функция, которая переделывает матрицу поворота в кватернион работает не правильно!

Прошло более 6 месяцев
#2
21:01, 5 янв. 2007

Может знает кто нибудь как правильно?

Я тут посмотрел D3DXQuaternionRotationMatrix котрая в d3dx9.lib d3dxmath.obj получилась примерно такая логика:

struct D3DXQUATERNION * D3DXQuaternionRotationMatrix(struct D3DXQUATERNION *pD3DQuaternion,
  struct D3DXMATRIX const *pD3DMatrix)
{
  float Diag, Diag1, Diag2, Diag3;
 
  Diag = pD3DMatrix->_22 + pD3DMatrix->_11 + pD3DMatrix->_33;
  if(Diag > 0){
    Diag = (sqrt(Diag+1.0f))*0.5f;
    pD3DQuaternion->w = Diag;
    Diag = 0.25f/Diag;
    pD3DQuaternion->x = (pD3DMatrix->_23 - pD3DMatrix->_32)*Diag;
    pD3DQuaternion->y = (pD3DMatrix->_31 - pD3DMatrix->_13)*Diag;
    pD3DQuaternion->z = (pD3DMatrix->_12 - pD3DMatrix->_21)*Diag;
  }
  else{
    Diag1 = pD3DMatrix->_11 - pD3DMatrix->_22 - pD3DMatrix->_33;
    Diag2 = pD3DMatrix->_22 - pD3DMatrix->_11 - pD3DMatrix->_33;
    Diag3 = pD3DMatrix->_22 + pD3DMatrix->_11 - pD3DMatrix->_33;
    if(Diag2 > Diag1)
      Diag = Diag2;
    else
      Diag = Diag1;
    if(Diag3 > Diag)
      Diag = Diag3;
    if(Diag == Diag1){
      Diag = (sqrt(Diag + 1.0f))*0.5f;
      pD3DQuaternion->x = Diag;
      Diag = 0.25f/Diag;
      pD3DQuaternion->y = Diag*(pD3DMatrix->_21 + pD3DMatrix->_12);
      pD3DQuaternion->z = Diag*(pD3DMatrix->_31 + pD3DMatrix->_13);
      pD3DQuaternion->w = Diag*(pD3DMatrix->_23 - pD3DMatrix->_32);
    }
    if(Diag == Diag2){
      Diag = (sqrt(Diag + 1.0f))*0.5f;
      pD3DQuaternion->y = Diag;
      Diag = 0.25f/Diag;
      pD3DQuaternion->z = Diag*(pD3DMatrix->_32 + pD3DMatrix->_23);
      pD3DQuaternion->x = Diag*(pD3DMatrix->_12 + pD3DMatrix->_21);
      pD3DQuaternion->w = Diag*(pD3DMatrix->_31 - pD3DMatrix->_13);
    }
    if(Diag == Diag3){
      Diag = (sqrt(Diag + 1.0f))*0.5f;
      pD3DQuaternion->z = Diag;
      Diag = 0.25f/Diag;
      pD3DQuaternion->x = Diag*(pD3DMatrix->_13 + pD3DMatrix->_31);
      pD3DQuaternion->y = Diag*(pD3DMatrix->_23 + pD3DMatrix->_32);
      pD3DQuaternion->w = Diag*(pD3DMatrix->_12 - pD3DMatrix->_21);
    }
  }
  return pD3DQuaternion;
}

Так правильно?

Прошло более 6 месяцев
#3
17:53, 16 июля 2007

В разделе Основные операции и свойства кватернионов опечатка:

>qq' = [ww' – v·v', vxv' + wv' + w'v]
>, где x - скалярное произведение, а · — векторное.

#4
13:37, 1 авг. 2007

but-cher
поправил.

Прошло более 1 года
#5
12:02, 7 авг. 2008

Вариант, написанный ранее мной, считал не совсем то, что нужно. Перепроверив его я убедился в том, что автор был абсолютно прав в следующих строках:

tr = m[0][0] + m[1][1] + m[2][2];

s = sqrt (tr + 1.0);
quat->w = s / 2.0;
s = 0.5 / s;
quat->x = (m[1][2] - m[2][1]) * s;
quat->y = (m[2][0] - m[0][2]) * s;
quat->z = (m[0][1] - m[1][0]) * s;
Одно непонятно: откуда получили выражение для tr < 0. Если бы автор прокомментировал это место, был бы очень признателен.

Нашел ошибку в функции QuaternionToMatrix. Там автор получает транспонированную матрицу. Т.е. для получения правильной матрицы полученную матрицу надо транспонировать.

#6
16:51, 13 авг. 2008

Вообще, для функции преобразования матрицы в кватернион я подобрал метод, работающий при любых значениях tr.
void MatrixToQuaternion(Quaternion * quat, float m[4][4])
{
  float  tr;

  tr = m[0][0] + m[1][1] + m[2][2];

  quat->w = 0.5 * sqrt(1.0 + tr);
  quat->x =  0.5 * sqrt(1.0 + m[0][0] + m[0][0] - tr);
  quat->y =  0.5 * sqrt(1.0 + m[1][1] + m[1][1] - tr);
  quat->z =  0.5 * sqrt(1.0 + m[2][2] + m[2][2] - tr);
  if (m[1][2] < m[2][1]) quat->x = - quat->x;
  if (m[2][0] < m[0][2]) quat->y = - quat->y;
  if (m[0][1] < m[1][0]) quat->z = - quat->z;
}

Прошло более 9 месяцев
#7
14:28, 22 мая 2009

По-моему здесь ошибка

q^(–1)=q*/norm(q)

если исходить из формулы

norm(q) = sqrt(w^2+x^2+y^2+z^2)

или

norm(q)=sqrt(qq*)

тогда наверно будет правильней написать

q^(–1)=q*/(norm(q)^2)

Прошло более 1 года
#8
21:35, 4 апр. 2011

народ, а скажите кватернион центр поворота содержит или нет? а то я не понял этго момента

#9
21:43, 4 апр. 2011

Поворот вокруг центра системы координат.

#10
16:43, 5 апр. 2011

а никто не знает можно ли из матрицы выделить центр поворота?

#11
17:27, 5 апр. 2011

Barbar1an
Какова размерность матрицы?

#12
18:23, 5 апр. 2011

ну стандартная 4 на 4

#13
19:59, 5 апр. 2011

Barbar1an
Поиск: декомпозиция матрицы.

Прошло более 1 года
#14
14:43, 8 мая 2012

В разделе Что это такое  судя из контекста опечатка:

, где i2= j2 = z2 = –1.

должно быть:
i2= j2 = k2= –1.

Страницы: 1 2 Следующая »
Sergei ShaykinФорум