Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 19.02.2013, 02:30   #1
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 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
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений
(для 1,359 пользователей)
Ответ: Смешивание анимаций

Вот то, что на выходе (стрелка вверх и вниз - сменить уклон ИИ)
Вложения
Тип файла: rar MadSkillz.rar (2.68 Мб, 418 просмотров)
__________________


(Offline)
 
Ответить с цитированием
Старый 19.02.2013, 09:32   #3
Platon
Знающий
 
Регистрация: 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
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений
(для 1,359 пользователей)
Ответ: Смешивание анимаций

Вот, полный код двига. Нужное находится в файле Actors.pb. Код не комментирован, но неплохо структурирован.
Планируется тот же IWYB, только с сетью и с приличным городом
Вложения
Тип файла: rar MadSkillz.rar (3.15 Мб, 423 просмотров)
__________________


(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
tirarex (19.02.2013)
Старый 19.02.2013, 23:49   #5
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 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
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 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
__________________
galaxies.su | dstalk.ru

Последний раз редактировалось DStalk, 21.02.2013 в 01:07.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Кирпи4 (21.02.2013)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com