March 29, 2024, 06:17
bigger smaller reset     1020px Wide width Full width Reset   * *

Gildor's Forums

  Homepage Facebook Read news on Twitter Youtube channel Github page
Welcome, Guest. Please login or register.
Did you miss your activation email?

« previous next »
Print
Author Topic: Loader psk Threejs  (Read 569 times)
lovepsone
Newbie
*
Posts: 19


View Profile
« Reply #15 on: December 16, 2021, 21:29 »

Спасибо, не понадобилась инверсия, просто я болван вместо Position экспортил Orientation, вместо Orientation экспортил Position.
В ходе тестирования наткнулся на проблемы, что некоторые модели почему то коряво играются. При длительном поиске и в своем коде(ну и конечно полез в доки унреала), выяснил что есть скелетная анимация и вершинная. Полистав код UModel, я понял, что при экспорте не зря создается .config файл для анимации. bAnimRotationOnly = 1 это скелетная анимация, если нет этого параметра, то вершинная. (поправьте если что не так понял).

Ну а теперь вопрос, как можно из вершинной, сделать скелетную анимацию? Ну или как происходит взаимодействие треков с вершинами? Или как-то все равно с костями играть надо? Ведь вершины веса не имеют. Или я что-то не так понимаю и несу ересь.
Спасибо за ваш ответ.


https://github.com/lovepsone/WEBLEngenie/blob/master/src/PSALoader.js - поддержка скелетной сетки.
Logged

Gildor
Administrator
Hero Member
*****
Posts: 7978



View Profile WWW
« Reply #16 on: December 16, 2021, 21:46 »

Скелетная анимация - это когда модель содержит привязку к скелету, и анимируется только скелет. Модель при этом получает деформацииот этого самого скелета.

Вершинная анимация - для моделей без скелета. Один из вариантов - MorphTarget в UE3/UE4, или в некоторых системах моделирования это Blend Shapes. В psa она не экспортится, потому что это не скелетная модель. Вершинная анимация широко использовалась в Quake 1-3 и Unreal 1. Начиная с UE2 движок перешёл на скелетную анимацию, а в UE3-UE5 она существует только в виде MorphTarget - это уже не анимация, а просто деформированный исходный mesh (то есть как бы только 1 кадр анимации), например - машина с вмятинами из-за повреждений.

Чтобы увидеть, правильно ли вы воспроизводите анимацию - можете попробовать загрузить её в 3ds Max - он мои config-и поддерживает. А вообще, не мешало бы сначала проверить анимацию в самом umodel. Есть к примеру "аддитивная анимация" - она и в umodel выглядит коряво, и ожидать чего-то от своей программы в данном случае не стоит.
Logged
lovepsone
Newbie
*
Posts: 19


View Profile
« Reply #17 on: December 16, 2021, 22:03 »

Ясно, спасибо за инфу. MorphTarget все понял, ибо в threejs тоже имеется такая фича (кушает много ресурсов). Пробовал только что проверять на Umodel... По ходу косяк все таки у меня. Буду копать в своем коде. Можно узнать подробную инфу про все параметры конфигов от psa?
Logged

Gildor
Administrator
Hero Member
*****
Posts: 7978



View Profile WWW
« Reply #18 on: December 16, 2021, 22:09 »

Можно узнать подробную инфу про все параметры конфигов от psa?
Её как таковой нет Smiley Посмотрите код Actor X Importer (MaxScript).
Logged
lovepsone
Newbie
*
Posts: 19


View Profile
« Reply #19 on: December 16, 2021, 22:27 »

Только что проверил десяток моделей с разными анимациями на UModel и на своем PSALoader. Из 10, 4 работали как в UModel, а остальные криво. (
Ну значит буду разбирать MAXScript и свой пока что костыль. Возможно что я что-то упускаю. Но это завтра. Спасибо, за то что отвечаете и не игнорите.

UPDATE:

Создал новое репо для загрузчиков. По степенно добавлю доки и примеры
https://github.com/lovepsone/Psk-Loaders
« Last Edit: January 11, 2022, 21:56 by lovepsone » Logged

lovepsone
Newbie
*
Posts: 19


View Profile
« Reply #20 on: March 08, 2024, 16:12 »

Здраствуйте, в общем вернулся к своей разработке.
Есть такой конфиг у анимации:
Code:
[RemoveTracks]
Male_lobby_back_idle_02.70=all
Male_lobby_back_idle_02.71=all
Male_lobby_back_idle_02.72=all
Male_lobby_back_idle_02.73=all
Male_lobby_back_idle_02.74=all
Male_lobby_back_idle_02.75=all
Male_lobby_back_idle_02.76=all
Male_lobby_back_idle_02.77=all
Male_lobby_back_idle_02.78=all
Male_lobby_back_idle_02.79=all
Male_lobby_back_idle_02.80=all
Male_lobby_back_idle_02.81=all
Male_lobby_back_idle_02.82=all
Male_lobby_back_idle_02.83=all
Male_lobby_back_idle_02.84=all
Male_lobby_back_idle_02.85=all
Male_lobby_back_idle_02.86=all
Male_lobby_back_idle_02.87=all
Male_lobby_back_idle_02.88=all
Male_lobby_back_idle_02.89=all
Male_lobby_back_idle_02.90=all
Male_lobby_back_idle_02.91=all

Я так понял флаг all исключает quaternion и position в проигрывании, но тогда что записывать в анимацию Huh? Просто если я
нечего не записываю, такое впечатление что анимация не доигрывается.

Вот к примеру я гружу составную модель (голова, шея, тело, руки, ноги, ступни - все раздельно), но у головы есть доп. кости у скелета 70-91. И вот такой артефакт имеем:



То есть голова как бы не на месте, а остальные части тела нормально стыкуются и проигрываются.

вот кусок моего кода :
Code:
                                   case 'RemoveTracks': {

                                        switch(cfgAnim[Anim[i].Name][j].flag) {

                                            case 'trans': {

                                                const t = new Float32Array(times[j]);
                                                const q = new Float32Array(quat[j]);
                                                KeyframeTracks.push(new THREE.QuaternionKeyframeTrack(`${BonesAnim[j].name.toLowerCase()}.quaternion`, t, q));
                                            }
                                                break;

                                            case 'rot':
                                                const t = new Float32Array(times[j]);
                                                const p = new Float32Array(pos[j]);
                                                KeyframeTracks.push(new THREE.VectorKeyframeTrack(`${BonesAnim[j].name.toLowerCase()}.position`, t, p));
                                                break;

                                            case 'all':
// вот этот флаг
                                                break;
                                        }
                                    }
                                    break;

код на гидхабе: https://github.com/lovepsone/Psk-Loaders/blob/main/src/PSALoader.js#L207
« Last Edit: March 08, 2024, 16:37 by lovepsone » Logged

lovepsone
Newbie
*
Posts: 19


View Profile
« Reply #21 on: March 22, 2024, 15:33 »

В общем удалось решить проблему, взяв со скелета pos и quat последней кости с тела персонажа и применить pos и quat к такой же кости скелета у головы и обновлять каждый кадр анимации. Я считаю что это хак, но пока что другого выхода не нашел.
Logged

Print 
« previous next »
Jump to:  

Powered by SMF | SMF © 2006-2009, Simple Machines LLC
Leviathan design by Bloc | XHTML | CSS