Войти
ПрограммированиеФорумГрафика

SMD анимация : ( Ни как не получается. (Решено - осталось несколько вопросов)) (7 стр)

Страницы: 1 2 3 4 5 6 7
#90
20:52, 14 мар 2013

Добрый вечер! Перелопатил весь форум, перепробовал все варианты что только смог найти, а в итоге так и не сдвинулся с места. Пишу под Android, причем сравнительно недавно. Остановился на загрузке данных из SMD файла... а дальше просто ступор. Помогите пожалуйста, уже башка трещит...

В общем имеется класс для хранения данных Сустава:

class Joint
{
  int JointIndex;
  int ParentJointIndex;
  
  float XTranslate;
  float YTranslate;
  float ZTranslate;
  
  float XRotate;
  float YRotate;
  float ZRotate;
  
  float[] LocalMatrix;
  float[] WorldMatrix;
  
  public Joint()
  {
    LocalMatrix = new float[16];
    WorldMatrix = new float[16];
    Matrix.setIdentityM(LocalMatrix, 0);
    Matrix.setIdentityM(WorldMatrix, 0);
  }
  
  public void ComputeLocalMatrix()
  {
    // матрицы
    float[] rotateX = new float[16];
    float[] rotateY = new float[16];
    float[] rotateZ = new float[16];
    float[] rotate = new float[16];
    float[] translate = new float[16];
    
    Matrix.setIdentityM(rotateX, 0);
    Matrix.setIdentityM(rotateY, 0);
    Matrix.setIdentityM(rotateZ, 0);
    Matrix.setIdentityM(rotate, 0);
    Matrix.setIdentityM(translate, 0);
    
    Matrix.multiplyMM(rotate, 0, rotateX, 0, rotateY, 0);
    Matrix.multiplyMM(rotate, 0, rotate, 0, rotateZ, 0);
    
    Matrix.translateM(translate, 0, XTranslate, YTranslate, ZTranslate);
    
    Matrix.multiplyMM(LocalMatrix, 0, translate, 0, rotate, 0);
  }
  
  public void ComputeWorldMatrix(float[] parentJointWorldMatrix)
  {
    if(parentJointWorldMatrix == null) // т.е если сустав не имеет родительского
      WorldMatrix = LocalMatrix;     // мировой будет его локальная матрица
    else
      Matrix.multiplyMM(WorldMatrix, 0, parentJointWorldMatrix, 0, LocalMatrix, 0);
  }

В самом парсере гружу данные и вызываю методы для расчета матриц:

                                        int index = Integer.parseInt( m.group(1) );
          
          Joints.get(index).XTranslate = Float.parseFloat( m.group(2) ); // x
          Joints.get(index).YTranslate = Float.parseFloat( m.group(4) ); // z
          Joints.get(index).ZTranslate = Float.parseFloat( m.group(3) ); // y
          Joints.get(index).XRotate = Float.parseFloat( m.group(5) );    // x rotate
          Joints.get(index).YRotate = Float.parseFloat( m.group(7) );     // z rotate
          Joints.get(index).ZRotate = Float.parseFloat( m.group(6) );     // y rotate
          
          Joints.get(index).ComputeLocalMatrix();
          
          if(Joints.get(index).ParentJointIndex == -1)
          {
            Joints.get(index).ComputeWorldMatrix(null); 
          }
          else
          {
            int ParentIndex = Joints.get(index).ParentJointIndex;
            Joints.get(index).ComputeWorldMatrix( Joints.get(ParentIndex).WorldMatrix );
          }

Дальше какие только варианты не пробовал, что-бы применить эти трансформации к вершинам(
Статический мешь грузиться верно, и все остальные данные тоже...
Анимацию пока загружать не хочу, т.к предчуствую еще больший геморой....

Собственно подскажите пожалуйста, правильно ли я рассчитываю матрицы? И как эти матрицы применить к суставам, что бы они встали на свои места?

Пробовал через Matrix.multiplyMV  умножать  нулевой вектор на полученную матрицу, а потом рисовать точки, что-бы увидеть правильно ли построен скелет. Все тщетно.

С Opengl дела не имел, с анимацией тоже( Читал, искал...

Страницы: 1 2 3 4 5 6 7
ПрограммированиеФорумГрафика

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