Привет !
на определенных треках встречаю артефакты, делаю так
1) в 3д максе выгружаю модель + бинд позу
2) в 3д максе загружаю трек для скелета ( скачанный с инета )
3) выгружаю трек
в двиге, иногда на определенных кадрах получаю артефакт, выглядит он так - на 13 кадре кость ноги выворачивается, далее на 14 встает на место, при этом если смотреть анимацию целиком то она идет отлично за исключением скачка в 13 кадре
если к примеру в 3д максе для ноги удалить ключ на 13 кадре - баг уходит ...
если же я делаю так
1) в 3д максе загружаю трек для скелета, выгружаю модель + бинд позу
3) выгружаю трек
все идет без артефактов, артефакты появляются не на всех треках, то есть первая последовательность в большинстве случаев работает отлично.
так вот вопросы:
1) это потому что треки сделаны не артистами
2) встречает ли кто то еще такие проблемы
3) стоит ли дебажить и выявлять проблему
4) это из серии артефактов кватернионов ?
инфо
- меш выгружается в ворлд позиции ( так же как и рутовая кость анимации )
- бинд поза это инверс ворлд позиции костей с нулевого кадра
... то есть весь скининг идет в ворлд позициях
в двиге все стандартно:
- перемножаю кости для нужного кадра ( то есть перевод в ворлд позицию )
- результат перемножаю с бинд позой
- результат умножаю в шейдере на вершину ( код для переможения взят из дума )
highp vec3 VertexTransform(highp vec3 p, int index) { highp vec4 quat = bonesRotations[index]; highp vec3 pos = bonesTranslations[index].xyz; highp float x = quat.x; highp float y = quat.y; highp float z = quat.z; highp float w = quat.w; highp float tx = pos.x; highp float ty = pos.y; highp float tz = pos.z; highp float xxzz = x*x - z*z; highp float wwyy = w*w - y*y; highp float xw2 = x*w*2.0; highp float xy2 = x*y*2.0; highp float xz2 = x*z*2.0; highp float yw2 = y*w*2.0; highp float yz2 = y*z*2.0; highp float zw2 = z*w*2.0; highp vec3 ret = vec3((xxzz + wwyy)*p.x + (xy2 + zw2)*p.y + (xz2 - yw2)*p.z, (xy2 - zw2)*p.x + (y*y+w*w-x*x-z*z)*p.y + (yz2 + xw2)*p.z, (xz2 + yw2)*p.x + (yz2 - xw2)*p.y + (wwyy - xxzz)*p.z); return ret + vec3(tx, ty, tz); }
ПЫСЫ, префикс стоит от балды ( я еще не оптимизировал этот момент )
как вы вообще делаете скининг ? какие правила у вас существуют для скинига ?
Тема в архиве.