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

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

Страницы: 1 2 Следующая »
#0
11:22, 12 янв. 2019
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 Ощущение будто вращается вокруг своих координат с добавлением половины расстояния между двумя суставами


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

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

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

#2
12:11, 12 янв. 2019

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

#3
13:49, 12 янв. 2019

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

#4
14:22, 12 янв. 2019

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

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

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

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

+ Показать


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

+ Показать

#6
15:15, 12 янв. 2019

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

#7
15:17, 12 янв. 2019

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

#8
15:19, 12 янв. 2019

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

#9
15:21, 12 янв. 2019

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

#10
15:36, 12 янв. 2019

*хелп*

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

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

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

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

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

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

#13
19:31, 12 янв. 2019

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

#14
20:39, 12 янв. 2019

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

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