|
3D-программирование Вопросы, касающиеся программирования 3D мира |
19.02.2013, 02:30
|
#1
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Смешивание анимаций
Итак, встал передо мной такой вопрос - надо смешать ТРИ анимации, хоть и не все сразу. Собственно, вот код (пуряк + 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
|
(Offline)
|
|
19.02.2013, 02:34
|
#2
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: Смешивание анимаций
Вот то, что на выходе (стрелка вверх и вниз - сменить уклон ИИ)
|
(Offline)
|
|
19.02.2013, 09:32
|
#3
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Ответ: Смешивание анимаций
Сообщение от Кирпи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 ?
Ну и по самой демке, диагональное движение не нормализовано, по лестнице тяжело поднимается ( может ее лучше невидимой плоскостью покрыть? ), моделька руки при анимации сильно дергается ( тоже кривое-смешивание? )
пока все
ЗЫ
может стоит обойтись как например в квейке - разделить модель на части и анимировать отдельно?
|
(Offline)
|
|
19.02.2013, 22:29
|
#4
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: Смешивание анимаций
Вот, полный код двига. Нужное находится в файле Actors.pb. Код не комментирован, но неплохо структурирован.
Планируется тот же IWYB, только с сетью и с приличным городом
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.02.2013, 23:49
|
#5
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: Смешивание анимаций
Решение
Бился очень долго, но сделал
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
Последний раз редактировалось Кирпи4, 20.02.2013 в 01:04.
|
(Offline)
|
|
21.02.2013, 00:06
|
#6
|
Разработчик
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений (для 1,072 пользователей)
|
Ответ: Смешивание анимаций
Если я все правильно понял, то вот так намного проще будет:
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
Последний раз редактировалось DStalk, 21.02.2013 в 01:07.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:57.
|