Показать сообщение отдельно
Старый 28.11.2009, 14:47   #32
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: проблемы с анимацией

Объясню что тебе нужно разобрать. При загрузке модели, которую тебе нужно анимировать в программе используй команду LoadAnimMesh, именно она загружает модель со всеми чилдами входящими в нее, в отличие команды LoadMesh(), которая объединяет все чилды в один меш и мы уже не сможим получить доступ к ним. Если у тебя анимация и модель находиться в одном файле, то тебе, чтобы вычленить Часть анимации нужно использовать ExtractAnimSeq(entity, frameStart, frameEnd), если же ты хранишь анимацию в отдельном файле от модели, то тогда используй команду LoadAnimSeq(entity, "file.b3d"). Причем, при создании анимации со скелетом ты этот самый скелет крепишь именно к какому-то чилду в модели перед экспортом в б3д. Чтобы найти этот чилд с анимацией, тебе нужно воспользоваться командой FindChild(model, "name"), причем тут очень важен регистр твоего названия, например чилд с именем "aNiMaTe" и "animate" будут разными чилдами, учти это. Когда ты найдешь этот чилд с анимацией всю обработку анимации веди с ним, то есть запускай анимацию именно для этого чилда, а не для модели. Теперь пойми, что "Запускать" и "Обновлять" это разные вещи, обновление анимации ведет команда UpdateWorld() и ее лучше ставить прямо перед командой RenderWorld(), а вот чтобы ЗАПУСТИТЬ анимацию нужно единожды вызвать команду Animate. Я например пользуюсь следующей схемой : Проверяю нажата ли нужная кнопка, проверяю проигрывается ли необходимая секвенция, и если не проигрывается, то запустить анимацию, также и при отпускании, проверяю, если не нажаты кнопки движения (или действия), то проиграть анимацию ожидания, либо вообще остановить анимацию. Теперь приблизительный код, который должен у тебя сложиться в результате понимания всего что я тебе написал :
model = LoadAnimMesh("model.b3d")
animChild = FindChild(model, "Animate")
seqIdle = ExtractAnimSeq(animChild, 0, 19)
seqRun = ExtractAnimSeq(animChild, 20, 40)

Repeat
    If KeyDown(200) Then
            If AnimSeq(animChild) <> seqRun Then Animate animChild, 1, 0.2, seqRun
    Else
            If AnimSeq(animChild) <> seqIdle Then Animate animChild, 1, 0.2, seqIdle
    EndIf

    UpdateWorld()
    Renderworld()
Until KeyDown(1)

end

Последний раз редактировалось H@NON, 28.11.2009 в 20:51.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо H@NON за это полезное сообщение:
KingMaks (28.11.2009), LUK (29.11.2009), Toon3D (08.12.2009)