Render.ru

CS + MAXScript = ?

Nail

Активный участник
Рейтинг
5
#1
Есть ли возможность MAXScript'ом управлять инструментами Character Studio?
В частности загружать bip файлы.
 

Nail

Активный участник
Рейтинг
5
#3
А поподробнее можно?
Интересует именно возможность загрузки bip-файла в CS через MAXScript.
 

Nail

Активный участник
Рейтинг
5
#5
Благодарю, нашел.

Теперь интересует как вытащить длину анимации из bip'а?
Она нужна для того чтоб можно было отрезать лишние кадры в сцене так, чтоб количество кадров в сцене = количество кадров в анимации bip'а.

Nail.

PS В хелпе нашел только как установить количество кадров в сцене:

animationRange=interval 0 x

где X = № последнего кадра.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#6
Эта функция должна помочь:

getTimeRange <controller> [ #selOnly ] [ #allKeys ] [ #children ]

Returns a time Interval value specifying the range of time covered by keys in the controller. The optional symbolic arguments specify options:

#selOnly: return the time range covered by the currently selected keys (in the track view)

#allKeys (default): the time range for all keys in the controller

#children: descends into sub-controllers and returns the total time interval covering all keys in all sub-controllers
 

Nail

Активный участник
Рейтинг
5
#7
Спасибо.
Нельзя ли указать, что не так:

Имеем сцену с бипедом с интервалом таймлайна 0 100(по умолчанию).
У анимации бипеда интервал 0 48.
Объект 'bip01 Head' имеет ключи анимации в кадрах с 0 до 48.

Выделив 'bip01 Head' на команды

getTimeRange $'bip01 Head'.controller #selOnly
или
getTimeRange $'bip01 Head'.transform.controller #selOnly

расчитывал получить значение: interval 0 48

выдало же:

(interval -1.34218e+007f -1.34218e+007f)

Если не так, тогда как?
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#8
Должен добратся до ключей
чтото вроде:
c = $'bip01 Head'.transform.controller.pos.controller.X_Position.controller
getTimeRange c
 

Nail

Активный участник
Рейтинг
5
#9
Не, это не то.
Начиная с pos и дальше это лишнее и не обрабатывается.

Перерыв хелп так и не нашел как правильно.

Исходя из примера в конце раздела Controller Time Functions
(
b=box height:10
at time 5 animate on b.height=50
at time 10 animate on b.height=100
bhc=b.height.controller
bhk=bhc.keys
supportstimeoperations bhc
deletetime bhc 4 5
bhk
deletetime bhc 4 5 #incLeft
bhk
deletetime bhc 1 4 #noslide
bhk
at time 5 animate on b.height=50
deletetime bhc (interval 5 8) #incLeft
bhk
at time 10 animate on b.height=150
for k in bhk do format "%:%\n" k.time k.value
reversetime bhc 5 15 #incLeft #incRight
for k in bhk do format "%:%\n" k.time k.value
insertTime bhc 12 5
bhk
getTimeRange bhc
)

, должно было работать то, что я и раньше писал:

getTimeRange $'bip01 Head'.controller

ну или

bo = $'bip01 Head'
bc = bo.transform.controller
getTimeRange bc

но не работает, черт его дери!
Точнее работает, но не так как хотелось бы.

Указанный пример я прогнал, он работает - команда getTimeRange bhc выдает
(interval 0f 20f).

Чтож, попытаюсь разобраться, что же в этом примере такого есть, что он нормально работает.
Или может дело в специфичности Бипеда, и то что работает с кубиком с бипедом не пашет?...
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#10
Дело все в том что у бипеда свой навороченный контроллер
который не дает доступ к внутреним контролерам
так что подобратся к ключам нет возможности

можно пойти другим путем - слить ключи в новый временный контроллер:

bip = $.controller
b=bezier_position()
biped.createPosSubAnims bip b true
getTimeRange b #children

НО Работать будет только in character studio 4 !!!!
 

Nail

Активный участник
Рейтинг
5
#11
Запустил код, открыл Track View, нашел добавленный контроллер bezier_position, но он пустой - без ключей.
Все ключи выше по дереву - в .transform.horizontal, но к ним, похоже, доступа нет.

Попробую поискать в хелпе по ключам что нить, поскольку добавив в bezier_position вручную ключи я смог получить с них интервал анимации через

с = $'Bip01.controller.Biped_SubAnim.controller.BipPositionList.controller.Bezier_Position.controller
getTimeRange с #children
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#12
Ладно в максе без изврата никак ;)

fn bipGetTime bip (

bip = bip.transform.controller
vertCont = bip.vertical.controller
i = 1
k

while on do
(
try k = biped.getKey vertCont i
catch exit
i + = 1
)
ftime = k.time
format "Time\t%\n" ftime
(ftime)
)

-- Example:
-- ==================
bipGetTime $Bip01
 

Nail

Активный участник
Рейтинг
5
#13
Огромнейшее спасибо!

Особенно за терпение :)
Ну и за функцию - сам бы не дошел, поскольку от программерства далеко.

Все получилось, правда пришлось разобраться что к чему, и привести функцию к рабочему состоянию.

Вот что получилось в итоге:

-- Load .bip & Range Animation v1.03

fn bipGetTime bip =
(
bipVertCont = bip.transform.controller.vertical.controller
i = 1
while true do
(
try k = biped.getKey bipVertCont i
catch exit
i += 1
)
ftime = k.time
ftime
)

if $Bip01 == undefined then
(
messageBox "No Biped in scene or Biped root name no 'Bip01' !" title: "Error"
)
else
(
if (getFiles "c:\\test.bip").count == 0 then
(
messageBox "Not found Bip File !" title: "Error"
)
else
(
biped.LoadBipFile $Bip01.controller "c:\\test.bip"
lastFrame = bipGetTime $Bip01
animationRange = interval 0f lastFrame
)
)

--


Еще раз спасибо за помощь.
Удачи!
Nail.
 

Nail

Активный участник
Рейтинг
5
#15
Будут проблемы - верну :)
А вообще я погонял скрип при разных условиях, в том числе и сразу после загрузки МАКСа. Кстати, совсем дилетантский вопрос (что-то не нашел в хелпе) - как переменные сбросить без перезапуска МАКСа?).

В общем - работает отлично.
Я так понял К перед циклом нужна была для инициализации, но, похоже, в МАХСкрипт можно инициализировать переменную сразу при ее использовании.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#16
смотря что ты под этим понимаеш
var = undefined
.......
gc()


>Я так понял К перед циклом нужна была для инициализации, но, похоже, в МАХСкрипт можно инициализировать переменную сразу при ее использовании.

Я предупредил если начнет глючит потом хрен найдеш
 
Сверху