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

Артефакты с анимацией

Страницы: 1 2 Следующая »
#0
pres1 | Артефакты с анимацией pointer | Артефакты с анимацией

На изображении крайний сустав вращается по траектории синего круга(см. изображение 2), хотя должен по его центру

Код прохода по суставам:

void Skeleton::update(UINT index, UINT poses)
{
  if (definition->joints[index].selfIndex == 0){
    Identity(FinalMat[index]);
  }
  else {
    FinalMat[index] = transformPose[index] * definition->joints[index].relativeMat
      * FinalMat[definition->joints[index].parent->selfIndex];
  }

  for (UINT i = 0; i < definition->joints[index].childCount; i++) {
    update(definition->joints[index].childs[i]->selfIndex, poses);
  }
}


Шейдер :

  output.Pos =mul(input.Pos, matrices[int(input.indices[0])]) * input.weights[0]+
        mul(input.Pos, matrices[int(input.indices[1])]) * input.weights[1]+
        mul(input.Pos, matrices[int(input.indices[2])]) * input.weights[2]+
        mul(input.Pos, matrices[int(input.indices[3])]) * input.weights[3];

матрицы для каждой кости(информацию несут только крайние, левые координаты)

+ Показать

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

12 янв. 2019, 11:22

#1

Более простое описание шейдера:

Финальная = Матрица вращения(от 0 до 360) * Относительная матрица * Финальная матрица папаши;

12 янв. 2019, 11:29 (Правка: 11:30)

#2

тоже наступил в Gimbal Lock ?)

12 янв. 2019, 12:11

#3

Mira
Не думаю что это он)

12 янв. 2019, 13:49

#4

Забавно, если сделать чтобы на вершину мог влиять только один сустав, то все нормально

12 янв. 2019, 14:22

#5

Выяснилось: что либо я неправильно экспортирую весы, либо неправильно их умножаю при свертывании меша

код экспорта весов:

+ Показать


код свертывания меша:

+ Показать

12 янв. 2019, 14:55 (Правка: 14:57)

#6

двойными кватернионами вращаешь или (не дай бох) эйлерами?

12 янв. 2019, 15:15

#7

по мне не оч красиво, но должно работать.
может матрицы в скелете перемножаешь криво?

12 янв. 2019, 15:17

#8

эйлеры то че, везде работают норм. при вращении по оси только делают "конфетку")

12 янв. 2019, 15:19

#9

lookid

//Матрицы поворота
void MatrixRotationX(MAT4X4 &mat, float Angle)
{
mat.e[0] = 1;
        mat.e[5] = cos(Angle);  mat.e[9] = sin(Angle);
        mat.e[6] = -sin(Angle); mat.e[10] = cos(Angle); 
                              mat.e[15] = 1;
}

Проблема не во вращении, в посте выше 2 кода в одном из них видимо ошибка.
Вот на этом скриншоте видно. Тот что слева свернут верно, справа мой вариант

Безымянный | Артефакты с анимацией

суставы как бы не до конца свернулись, не дошли до своей точки:D

12 янв. 2019, 15:21

#10

*хелп*

12 янв. 2019, 15:36

#11

relativeMat это у тебя инв. матрица в bind pose?

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

12 янв. 2019, 16:27 (Правка: 16:39)

#12

nullptr
Можно поподробнее?

я уже запутался в названиях матриц...

12 янв. 2019, 18:18 (Правка: 18:21)

#13

nullptr
можно тупо умножать матрицы биндпоз на матрицы фигуры и отдавать в шейдер только их)

12 янв. 2019, 19:31

#14

ildar
ну, ты когда в блендере меш заскинил то положение костей в этот момент это bind pose и вот финальные матрицы, которые ты в шейдер передаешь должны быть относительно этой бинд позы..
Mira
да, но в таком случае тебе придется еще и ворлд матрицу в шейдер передавать и умножать каждую вершину на +еще одну матрицу.. а на цпу-то все равно нужно кости в ворлд спейсе иметь так как наверняка к ним что-то аттачится (коллайдеры, какие-то объекты, ...)

12 янв. 2019, 20:39

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика