forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   help B3D-anime (http://forum.boolean.name/showthread.php?t=1635)

ABTOMAT 27.01.2007 22:56

Re: help B3D-anime
 
Цитирую себя:
Цитата:

Народ, а кто-нить знает, как сделать зависимость скорости проигрывания анимации от частоты кадров в секунду?
Цитирую Stalnoy_Gvozd':
Цитата:

Мне тоже ето весьма интересно
А я разобрался! Чтоб вы немучились, пишу как это сделать:
Цитата:

Кароче, вот мои рассуждения.
1. Измерить время от одного рендера до другого.
Сначала нуно узнать точное время (желательно Московское, но и системное время сойдёт) и чем точнее - тем лучше. Системный таймер измеряет время с точностью до 1 милисекунды, нам этого хватит. Создаём переменную, где будет указано в ремя ДО рендера:
Global: BeforeRender
И после рендера:
Global BeforeRender, AfterRender
И узнать их значения. Команду
BeforeRender = Millisecs()
пишем в цикле ДО команды
RenderWorld
А команду
AfterRender= Millisecs
после.
Потом вычисляем разницу:
Elapsed = AfterRender - BeforeRender
Эту команду пишем в цикле перед командой Untill
Да, кстати, переменную Elapsed нуно объявить в блоке переменных:
Global BeforeRender, AfterRender, Elapsed
После этого пишем саму программу. И теперь если нужно передвинуть объект, то мы пишем не число, а число*Elapsed:
If KeyDown(200) MoveEntity cub,0,0,0.1*Elapsed
If KeyDown(208) MoveEntity cub,0,0,-0.1*Elapsed
If KeyDown(203) MoveEntity cub,-0.1*Elapsed,0,0
If KeyDown(205) MoveEntity cub,0.1*Elapsed,0,0

Вот теперь работать буит на любой машине без глюков (даже если тормозит, то замедления не случится)
Кстати, с анимацией всё точно так же. Нужно умножать на Elapsed скорость проигрывания анимации
Привожу полный код проги:
Global BeforeRender, AfterRender, Elapsed
Graphics3D 1280,1024,32,1
BackBuffer()
light=CreateLight()
timer=CreateTimer(300)
;таймер-ограничитель fps. Число в скобках - максимальное fps.
;Здесь, в общем-то ограничитель не нужен,
;почему я его тут поставил читай ниже
cam=CreateCamera()
cub=CreateCube()
PositionEntity cub,0,-10,20
BOT=LoadAnimMesh("01.B3D")
ScaleEntity BOT,.05,.05,.05
PositionEntity BOT,0,1,20

LoadAnimSeq BOT,"01.B3D"
PointEntity cam,bot

Repeat
BeforeRender = MilliSecs()
If KeyDown(200) MoveEntity cub,0,0,0.05*Elapsed
If KeyDown(208) MoveEntity cub,0,0,-0.05*Elapsed
If KeyDown(203) MoveEntity cub,-0.05*Elapsed,0,0
If KeyDown(205) MoveEntity cub,0.05*Elapsed,0,0
If KeyDown(57) And AnimSeq=0 Animate BOT,1,.02*Elapsed,1,0
WaitTimer(timer) ; Процедура ограничения fps. Уберёшь эту команду -
;ограничения не буит.
UpdateWorld()
RenderWorld()
Font=LoadFont("Arial cyr",30,True)
SetFont(Font)
Color 0,255,0
Text 640,50,"Стрелки - управление кубиком",True,True
Text 640,75,"Пробел - начало анимации",True,True
Text 640,100,"Escape - выход",True,True
AfterRender = MilliSecs()
Flip 0
Elapsed = AfterRender - BeforeRender
Until KeyHit(1)

End


Я вставил ограничитель кадросекунд специально чтобы вы могли убедиться: работа программы не зависит от FPS, сами ставьте любые значения и проверяйте.
Вместо файла 01.b3d возьмите любой .b3d-шный файл, переименуйте в 01.b3d и закиньте в папку с прогой.
Хе-хе. Не так уж всё и сложно. Между прочим, я всё сам сделал и прописал, у знакомых на форуме тока команды спрашивал. Насчёт ограничения FPS. Ограничить - тоже вариант, но есть причины, по которым его не следует использовать:
1. Если машина мощная, то почему бы не использовать её потенчиал, делая столько fps, скоко этоа машина может выдавать. А если поставим ограничение в 30 кадров (хотя машина может выдать и 70), то пользователь не обрадуется да и самому неприятно.
2. Если же машина наоборот слишком слабая, то кол-во кадров в секунду упадёт и упадёт скорость работы самой игры (если мы можем поставить максимальное fps, то минимальное уже не ограничишь - не тянет машина и всё тут), так как скорость работы игры зависит от fps. Снижается fps => снижается скорость работы игры.
Надеюсь, понятно всё объяснил. А вот с моим стабилизатором при любом fps на любой машине работать будет с одинаковой скоростью. Почитай там код, разберёшься как модели свои вставлять и т.д.
И, чуть не забыл. Использовать ограничитель fps следует если вы делаете простенькую игрушку нетребовательную к ресурсам компа. (т.к. стабилизатор тормозит сильнее чем ограничитель). Поставишь ограничение в 30 кадров - и этого хватит чтоб сыгарть в простенькую аркаду. Для серьёзных проектов пользуйся ограничителем.

Хух.... Выложился на полную катушку. Кто тут админ? За хорошие, полные и досканальные ответы тут не полагается, скажем, звёздочек под аватаром или там смена статуса (Достал меня статус "Any Key'щик", хочу "АК-47")? Лана, я ж прикольнулся. (Но было бы приятно)

Черный крыс 27.01.2007 23:36

Re: help B3D-anime
 
Способ который ты пытался реализовать - называется "Дэльта-тайминг"....причем, он у тебя весьма криво реализован.... - делается твоя билеберда двумя строчками....

Цитата:

dt#=(MilliSecs()-LastFrame)*0.4
LastFrame=MilliSecs()
Этим все сказано...

Diplomat 28.01.2007 00:29

Re: help B3D-anime
 
2 Diablo1909: Какой коефициент забавный: 0.4... А главное- жОсткая константа. Собственно, 0.4- это ответ на Главный Вопрос Вселенной, только почему он столь императивно закреплен в вышеприведенном коде?
Почему именно 0.4? Ведь "03"- звучит символичнее, а "0.5"- ближе сердцу русского человека...
:-)

ABTOMAT 28.01.2007 01:00

Re: help B3D-anime
 
Товарищ Диабало, вот у меня как раз всё хоть и длинне зато некоряво. У меня происходит тока одно вычисление в самом начале, а потом уже готовое значение подставляется куды нуно. А у тебя скоко раз используется значение это, стоко же раз и выполняется вычисление, хотя значение, по идее, одно.
Если кто-то скажет, что в этом я не прав, очень интересно послушать:glag:
Кстат, не тебя ли я встречал в форумах GamesAnatomy и если да, то не знаешь, что у них с сервером?

ЛысыЙ_Чук-Иванчук 28.01.2007 09:18

Re: help B3D-anime
 
Цитата:

Кстат, не тебя ли я встречал в форумах GamesAnatomy и если да, то не знаешь, что у них с сервером?
Батарея села-Заряжают:)

Stalnoy_Gvozd' 28.01.2007 09:24

Re: help B3D-anime
 
Хех! Да ну? Честно говоря это я у жо давно сделал, но всё равно спасибо за просвещение еще не просвященных прохожих етой темы.
Я как раз таки объясняю
"...недавно решил сделать дельтатайминг, дык как толькотормоза спадают, и при этом уже была запущена какая либо анимация, эта самая анимация соответсно ускоряется..."

Проблема как-раз в Animate BOT,1,.02*Elapsed,1,0
если в первом кадре были тормоза, то к примеру Elapsed=10,:(
при етом если в следующем кадре вдруг фпс возросло, то Elapsed=1,:)
НО при етом анимация продолжает проигрываться как Animate BOT,1,.02*10,1,0:dry:

Вот это я и пытался сказать.

ABTOMAT 28.01.2007 11:34

Re: help B3D-anime
 
Цитата:

НО при етом анимация продолжает проигрываться как Animate BOT,1,.02*10,1,0
Ну енто уж извини, никак не исправишь. Да лана, такие скачки производительности очень редкие. Кстати насчёт корявости проги. Тут я немного ступил, моно обойтись без переменной AfterRender:
Цитата:

Global BeforeRender, Elapsed
Graphics3D 1280,1024,32,1
BackBuffer()
light=CreateLight()
timer=CreateTimer(300)
cam=CreateCamera()
cub=CreateCube()
PositionEntity cub,0,-10,20
BOT=LoadAnimMesh("01.B3D")
ScaleEntity BOT,.05,.05,.05
PositionEntity BOT,0,1,20

LoadAnimSeq BOT,"01.B3D"
PointEntity cam,bot

Repeat
BeforeRender = MilliSecs()
If KeyDown(200) MoveEntity cub,0,0,0.05*Elapsed
If KeyDown(208) MoveEntity cub,0,0,-0.05*Elapsed
If KeyDown(203) MoveEntity cub,-0.05*Elapsed,0,0
If KeyDown(205) MoveEntity cub,0.05*Elapsed,0,0
If KeyDown(57) And AnimSeq=0 Animate BOT,1,.02*Elapsed,1,0
WaitTimer(timer)
UpdateWorld()
RenderWorld()
Font=LoadFont("Arial cyr",30,True)
SetFont(Font)
Color 0,255,0
Text 640,50,"Стрелки - управление кубиком",True,True
Text 640,75,"Пробел - начало анимации",True,True
Text 640,100,"Escape - выход",True,True
Flip 0
Elapsed = Millisecs() - BeforeRender
Until KeyHit(1)

End
А так всё такое же. И вовсе некорявое

Stalnoy_Gvozd' 28.01.2007 13:16

Re: help B3D-anime
 
А можно как нибудь показывать определенный кадр анимации вручную?
Допустим вывести кадр 12.5 и тп.

Diplomat 28.01.2007 13:31

Re: help B3D-anime
 
1. ABTOMAT : Во-первых, твоё виденье философской сути дельта-тайминга действительно несколько необычно и отдает трансцендентальной философией. Давай лучше оставаться в границах диалектики и не строить необоснованных теорий?

2. ABTOMAT : Во-вторых, код Diablo1909 используется как раз всего единожды за проход цикла (почему ты, решил, что может быть иначе?), и единственная его прямая ошибка, это нелепая константа "0.4".

3. Stalnoy_Gvozd' : Цитирую русскую версию Хелпа:
Цитата:

UpdateWorld [anim_speed#]
Параметры
anim_speed# (необязательно) - значение скорости анимации. По умолчанию равно 1.
Определение
Анимирует все объекты в мире, и производит проверку столкновений.
Необязательный параметр anim_speed# позволяет менять скорость анимации всех объектов сразу. Значение 1 это проигрывание анимаций с их настоящей скоростью, значение 2 анимирует объекты с удвоенной скоростью, и так далее.
Для лучшего результата эта команда должна вызываться один раз за цикл, перед вызовом команды RenderWorld.
P.S. Люди! Будьте бдительны! (с)

Stalnoy_Gvozd' 28.01.2007 22:04

Re: help B3D-anime
 
Неимоверное спасибо!:super:
Далее бдю!

ЛысыЙ_Чук-Иванчук 28.01.2007 22:47

Re: help B3D-anime
 
Цитата:

Неимоверное спасибо!:super:
Далее бдю!
ХМ, я думал то что написал Diplomat знают все:(

Vyacheslav 29.01.2007 15:55

Re: help B3D-anime
 
Еще раз к вопросу об анимациях...
А как сделать следующее:
Например, у нас есть 3 анимации - .b3d файла

Итак:

pers\mesh=LoadAnimMesh("creature_stand.b3d")

pers\Body=FindChild(pers,"Body")

Animate pers\Body

А что, если надо еще анимационные последовательности, к примеру:

LoadAnimSeq (pers\mesh,"creature_move.b3d")
LoadAnimSeq (pers\mesh,"creature_attack.b3d")

Как проигровать pers\Body ? Ведь для него будет только одна анимационная последовательность...
Т.е. Animate pers\Body,1,1,1,10 уже не катит... А в любом случае нужно искать чайлды, а то только бипед не нуждается в этом.

Т.е как сделать, чтобы pers\Body=FindChild(pers,"Body") можно было использовать для проигрывания нескольких аним. последовательностей?

Si-Jey 14.01.2010 02:02

Ответ: help B3D-anime
 
Привет всем, прочитал всю ветку-но так и не разобрался.
Имеется модель человека со скелетом (biped),открываю файл анимации(.bip) и модель начинает двигаться-все ОК.Но после экспорта в b3d(все галки поставлены) и ее анимации-анимируется лишь скелет,а модель стоит на месте-такое же наблюдается и в Preview Пипилайна анимируется только скелет модели.
Хелпа по Пипилайну нет.
Обьясните пожалуйста как заставить двигаться саму модель в блице?
Уже не стоит обьяснять,я разобрался-у меня привязка скелета к модели основано на модификаторе Physique,который Пипилайн не поддерживает.
Часть цитаты из экспортного окна:
"Skinned Meshes:
Skin, Max Bones and Biped are supported (NOT Physique)
Only bones referenced in the Skin modifier are exported
Blitz3d supports up to 256 bones per object
"

ABTOMAT 14.01.2010 02:54

Ответ: help B3D-anime
 
Цитата:

Обьясните пожалуйста как заставить двигаться саму модель в блице?
http://forum.boolean.name/showthread.php?t=7338

Darksoul 30.01.2010 18:59

Ответ: help B3D-anime
 
Вложений: 1
Хочу возродить тему.
Прошу кирпичами не кидать!
Вопрос такой. У меня чувак сделаный в Максе, экспортирован через B3d pipelin в один фаил Меша, и несколько файлов анимации(run, walk, walkw, stand - чувак бежит, чувак идет, чувак идет с оружием, чувак стоит.)
Все согласно рекомендациям этого форума.
Однако ж при переключении анимации, возникают некоторые непонятности. После перехода с анимации "бега" на "стоит" руки персонажа, которые должны деражть оружие, кудато смещаются, в зависимости от момента переключения. Такое ощущение, что блитз запаминает позицию некоторых костей и переносит в следущую анимацию... Обьяснить трудно. прикрепляю проект, Посмотрите пожалуйста, может у кого есть соображения по этому поводу... Если проблемы с руками(моими), не ругайтесь, обьясните. :"(


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

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