forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Смешивание анимаций (http://forum.boolean.name/showthread.php?t=17906)

Кирпи4 19.02.2013 02:30

Смешивание анимаций
 
Итак, встал передо мной такой вопрос - надо смешать ТРИ анимации, хоть и не все сразу. Собственно, вот код (пуряк + SDK)

Код:

Procedure InterpolateHumanBones(mesh1,mesh2,mesh3,delta.f)
        Protected dl.f
        Restore HumanAlignBones
        Read.b count
        For i=1 To count
                Read.s name.s
                If delta>=0.5
                        ch1 = bbFindChild(mesh1,name)
                        ch2 = bbFindChild(mesh2,name)
                       
                        dl = (delta - 0.5) * 2
                       
                        x1.f = bbEntityPitch(ch1,0)
                        y1.f = bbEntityYaw(ch1,0)
                        z1.f = bbEntityRoll(ch1,0)
                       
                        x2.f = bbEntityPitch(ch2,0)
                        y2.f = bbEntityYaw(ch2,0)
                        z2.f = bbEntityRoll(ch2,0)
                       
                        x.f = (x2-x1)*dl + x1
                        y.f = (y2-y1)*dl + y1
                        z.f = (z2-z1)*dl + z1
                       
                        bbRotateEntity(ch1,x,y,z,0)
                Else
                        ch1 = bbFindChild(mesh1,name)
                        ch2 = bbFindChild(mesh3,name)
                       
                        dl = 1-(delta*2)
                       
                        x1.f = bbEntityPitch(ch1,0)
                        y1.f = bbEntityYaw(ch1,0)
                        z1.f = bbEntityRoll(ch1,0)
                       
                        x2.f = bbEntityPitch(ch2,0)
                        y2.f = bbEntityYaw(ch2,0)
                        z2.f = bbEntityRoll(ch2,0)
                       
                        x.f = (x2-x1)*dl + x1
                        y.f = (y2-y1)*dl + y1
                        z.f = (z2-z1)*dl + z1
                       
                        bbRotateEntity(ch1,x,y,z,0)
                EndIf
               
        Next
EndProcedure

DataSection
        HumanAlignBones:
        Data.b 25
        Data.s "Bip01 Spine1"
        Data.s "Bip01 Spine2"
        Data.s "Bip01 Spine3"
        Data.s "Bip01 Neck"
        Data.s "Bip01 L Arm"
        Data.s "Bip01 L Arm1"
        Data.s "Bip01 L Arm2"
        Data.s "Bip01 R Arm"
        Data.s "Bip01 R Arm1"
        Data.s "Bip01 R Arm2"
        Data.s "Bip01 Head"
        Data.s "Bip01 L Hand"
        Data.s "Bip01 L Finger0"
        Data.s "Bip01 L Finger01"
        Data.s "Bip01 L Finger02"
        Data.s "Bip01 L Finger1"
        Data.s "Bip01 L Finger11"
        Data.s "Bip01 L Finger12"
        Data.s "Bip01 R Hand"
        Data.s "Bip01 R Finger0"
        Data.s "Bip01 R Finger01"
        Data.s "Bip01 R Finger02"
        Data.s "Bip01 R Finger1"
        Data.s "Bip01 R Finger11"
        Data.s "Bip01 R Finger12"
EndDataSection

В итоге при delta некратном 0.5 начинается сраная мешанина и всё адово дёргается. Помогите, срочняк надо...

Насилую модельки из Day of Defeat с GoldSrc

Кирпи4 19.02.2013 02:34

Ответ: Смешивание анимаций
 
Вложений: 1
Вот то, что на выходе (стрелка вверх и вниз - сменить уклон ИИ)

Platon 19.02.2013 09:32

Ответ: Смешивание анимаций
 
Цитата:

Сообщение от Кирпи4
Вот то, что на выходе (стрелка вверх и вниз - сменить уклон ИИ)

В демке нпц просто голову вверх-вних наклоняет, о каком смешивании ты говоришь?:)
По коду выше
во-первых забудь про углы эйлера, для смешивания нужно оперировать кватернионами и юзать slerp.
во-вторых непонятно вообще что происходит там, mesh1, mesh2 и mesh3 это одна и та-же кость, имя-то одно для чайлдов.
да и еще, нафига константное условие "If delta>=0.5" внутри цикла?

ЗЫ
По коду Main.pb в аттаче
Код:

InitSprite() : InitSound()
UseOGGSoundDecoder() : UsePNGImageDecoder() : UsePNGImageEncoder()

Остальных исходников там нет, поэтому непонятно зачем ты это все используешь, раз подключил BlitzSDK.
Код:

Console = OpenWindow(1,...
...
If OpenWindow(3,...
...
CloseWindow(3) ; Killing console

так какое окно консоль, 1 или 3 ?:) А может лучше заюзать виндовую консоль функцией OpenConsole ?
Ну и по самой демке, диагональное движение не нормализовано, по лестнице тяжело поднимается ( может ее лучше невидимой плоскостью покрыть? ), моделька руки при анимации сильно дергается ( тоже кривое-смешивание? )
пока все :)

ЗЫ
может стоит обойтись как например в квейке - разделить модель на части и анимировать отдельно?

Кирпи4 19.02.2013 22:29

Ответ: Смешивание анимаций
 
Вложений: 1
Вот, полный код двига. Нужное находится в файле Actors.pb. Код не комментирован, но неплохо структурирован.
Планируется тот же IWYB, только с сетью и с приличным городом

Кирпи4 19.02.2013 23:49

Ответ: Смешивание анимаций
 
Решение
Бился очень долго, но сделал

Код:

Function InterpolateAngle#(angle1#,angle2#,delta#)
        If angle1>angle2
                If 360-(angle1-angle2)<180
                        angle2=angle2+360
                        Return (angle1+(angle2-angle1)*delta) Mod 360
                Else
                        angle1=angle1 + 180
                        angle2=angle2 + 180
                        Return (angle1+(angle2-angle1)*delta)-180
                EndIf
        Else
                If 360-(angle2-angle1)<180
                        angle1=angle1+360
                        Return (angle1+(angle2-angle1)*delta) Mod 360
                Else
                        angle1=angle1 - 180
                        angle2=angle2 - 180
                        Return (angle1+(angle2-angle1)*delta)+180
                EndIf
        EndIf
EndFunction


DStalk 21.02.2013 00:06

Ответ: Смешивание анимаций
 
Если я все правильно понял, то вот так намного проще будет:

Код:

Function InterpolateAngle#(angle1#,angle2#,delta#)

        dAngle#=angle2#-angle1#

        ;Если разность углов больше 180, значит в другую сторону крутить ближе будет:)
        If Abs(dAngle#)>180 Then
                Return angle1#-(360*Sign(dAngle#)-dAngle#)*delta#
        Else
                Return angle1#+dAngle#*delta#
        EndIf

EndFunction



Часовой пояс GMT +4, время: 01:54.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot