Версия для печати темы
Форум .:3DCenter.ru:. _ Maxscript _ Hide - Unhide
Автор: ja_elektronic 04/06/2006, 15:03
и так, имеются прономерованные объекты типа object_name_0000 - object_name_9999 имеется такое же количество кадров , все объекты скрыты.
-----
задача: как сделать так чтобы при передвижении ползунка SliderTime в определённый кадр например 28 к объекту номер object_name_0028 применялся unhide а все остальные скрывались
Заранее благодарю в любой оказанной помощи в написание этого скрипта
Автор: 111 04/06/2006, 15:29
ну и в чём проблема?
Автор: ja_elektronic 04/06/2006, 15:38
QUOTE(111 @ 04/06/2006, 16:29) [snapback]649091[/snapback]
ну и в чём проблема?
Проблема в том что с MaxScript я дружу очень преблизительно сейас читаю
http://www.rusring.net/~maxscript/ но покачто не разобрался как написать скрипт для решения этой задачи если ктонибудь хотябы подсказал от чего оттолкнуться это очень бы мне помоголо
Автор: ja_elektronic 04/06/2006, 15:57
я так понимаю что начинаться скрипт должен так
CODE
hide object_name_*
и как мне теперь обозначить что
CODE
unhide object_name_"текущий кадр"
Автор: scripter 04/06/2006, 16:03
at time nomerkadra do ...
Автор: ja_elektronic 04/06/2006, 16:18
QUOTE(scripter @ 04/06/2006, 17:03) [snapback]649126[/snapback]
at time nomerkadra do ...
можно поподробней я несовсем уловил мысль
Автор: scripter 04/06/2006, 16:32
для первого кадра пишешь:
at time 1 do (твои действия)
для второго кадра пишешь:
at time 2 do (твои действия)
и так далее.
Цикл организовать милое дело, тем более имя объекта включает в себя число.
ЗЫ
А если перед этим всем напишешь "animate on", то в результате работы скрипта сформируются соответствующие ключи анимации на видимость-невидимость объектов.
Автор: ja_elektronic 04/06/2006, 16:48
мне как раз-таки ненужно анимировать Visibility.
hide - unhide , это свойство объекта не анимируемо.
Такчто проставление ключей методом animate on мне неподходит
нужен unhide обектов по номеру текущего кадра, только вот операция типа
x = "object_name_" + sliderTime ,
выдаёт -- Unable to convert: 50f to type: String
Автор: ja_elektronic 04/06/2006, 17:00
кароче нужно чтото типа такого
hide $object_name_*
X = sliderTime
at time X unhide $object_name_"текущий кадр"
как правильно написать так чтобы вместо _"текущий кадр" подставлялось значение X
Автор: Svetozar 04/06/2006, 17:45
в максе есть трек видимости - его мона анимировать
Автор: ja_elektronic 04/06/2006, 17:49
QUOTE(Svetozar @ 04/06/2006, 18:45) [snapback]649203[/snapback]
в максе есть трек видимости - его мона анимировать
я и говорю мне ненужен трэк видимости
мне нужен Hide - Unhide
по номеру текущего кадра
Автор: scripter 04/06/2006, 17:57
QUOTE(ja_elektronic @ 04/06/2006, 17:48) [snapback]649165[/snapback]
x = "object_name_" + sliderTime
попробуй вместо
x = "object_name_" + sliderTimeнабить
x = "object_name_" + (sliderTime as string)
Автор: Svetozar 04/06/2006, 18:18
например:
CODE
clearlistener() -- чистим Listener... не обязательно, но мне нравиться %)
q = 6 -- колличество объектов
with animate on
(
--сначала ставим все объекты в визибл=неправда в первом кадре
at time 0
(
for curtime=1 to q do
(
command = ("$obj_0"+(curtime as string)+".visibility = false") as string
execute command
)
)
--потом анимируем еффект появления и изчезновения
for cur=1 to q do
(
command1 = ("$obj_0"+(cur as string)+".visibility = false") as string
command2 = ("$obj_0"+(cur as string)+".visibility = true") as string
at time (cur-1) execute command1
at time (cur) execute command2
at time (cur+1) execute command1
)
)
Автор: Svetozar 04/06/2006, 18:20
QUOTE(ja_elektronic @ 04/06/2006, 18:49) [snapback]649206[/snapback]
QUOTE(Svetozar @ 04/06/2006, 18:45) [snapback]649203[/snapback]
в максе есть трек видимости - его мона анимировать
я и говорю мне ненужен трэк видимости
мне нужен Hide - Unhide
по номеру текущего кадра
настаиваешь
тогда юзай коммнады:
CODE
hide <node> -- mapped
Hides the specified node or node collection.
unhide <node> [doLayer:<boolean>] -- mapped
Unhides the specified node or node collection.
If the optional doLayer keyword is set to true and the node is in a layer that is hidden, the entire layer is unhidden. When false (the default), just the node is unhidden.
Автор: ja_elektronic 04/06/2006, 18:21
хорошо предположим у меня есть объекты с именами типа object_name_00f - object_name_99f
sliderTime находится в 14 кадре
выполняю :
hide $object_name_*
Y = "object_name_" + (sliderTime as string)
X = sliderTime
at time X unhide Y
получаю :
-- No ""unhide"" function for "object_name_14f"
что я делаю не правильно
Автор: scripter 04/06/2006, 18:45
по-моему ты знак доллара забыл поставить перед именем объекта.
Автор: ja_elektronic 04/06/2006, 18:56
хороше выполняю
CODE
hide $object_name_*
Y = ("$object_name_" + sliderTime as string)
X = sliderTime
at time X unhide Y
получаю
CODE
OK
"$object_name_16f"
16f
-- No ""unhide"" function for "$object_name_16f"
OK
Автор: scripter 04/06/2006, 19:13
вот работающие строки:
EXECUTE "HIDE $Box01"
EXECUTE "UNHIDE $Box01"
То есть по ключу "at time" генеришь строчки-команды и делаешь им EXECUTE.
Что-то вроде:
at time x execute("unhide $object_name_" + x as string)
Автор: ja_elektronic 04/06/2006, 19:29
CODE
hide $object*
X = sliderTime
Command = ("UNHIDE $object" + sliderTime as string)
at time X EXECUTE Command
Вроде работает. как мне теперь сделать чтобы скрипт выполнялся при передвижении ползунка или при нажатии Play
Автор: scripter 04/06/2006, 19:35
что-то мне подсказывает, что ключи расставить...
т.е. включить animate on. А может и свойство visible подключить все-таки.
Автор: ja_elektronic 04/06/2006, 19:45
ну зачем визибл у меня вот 999 моделей по нескольку миллионов полигонов если они все будут во вью порте как сетка отображаться то мне визибл не товарищь
Автор: Svetozar 04/06/2006, 20:27
ты пытаешься hide строку string...
а тебе нужен объект $object_name_14f
и обязателньо не в виде строки "$object_name_14f", а конкретно по $object_name_14f !!!
для удобства и сухости пользуй функцию execute - она выполняет твою строчку as string как обычную комманду максСкрипта...
*-----------
херасе... пока писал - скока уже ответили %)))
Автор: Svetozar 04/06/2006, 20:31
зацени как работает это:
CODE
fn p = print currentTime
registerTimeCallback p
и используй
Автор: scripter 04/06/2006, 21:00
такая схема не подойдет?
for i=0 to 999 do
(
sliderTime= i
--здесь пишешь то, что уже обсудили
)
а если вручную ползунок двигать собираешься, то ничего толкового в голову не приходит, кроме коллбэка...
Автор: Svetozar 04/06/2006, 21:05
А судя по тому, что он хочет - ему тока колбэком пользоваться надо...
Автор: ja_elektronic 04/06/2006, 21:07
у меня теперь другая прблема я щас читал мануал по MaxScript дошёл до главы
Операторы цикла do и while
вчасности меня зантересовали строки "При этом на совести программиста остается обязанность следить за тем, чтобы условие, стоящее после while хотя бы когда-нибудь получило значение false. В противном случае 3ds max зависнет и его придется выгружать насильно"
я как умный человек возми да и попробуй ну у меня теперь макс вобще не запускается чё делать
Автор: scripter 04/06/2006, 21:27
Видать в чего-то в "3dsmax.ini" не того записалось... Тут уж в другую ветку писать надо. А насчет этой - если таймслайдер вручную двигать хочешь, то коллбэк, однозначно
Автор: Yuri Yarunin 04/06/2006, 21:48
QUOTE(ja_elektronic @ 04/06/2006, 22:07) [snapback]649377[/snapback]
у меня теперь другая прблема я щас читал мануал по MaxScript дошёл до главы
Операторы цикла do и while
вчасности меня зантересовали строки "При этом на совести программиста остается обязанность следить за тем, чтобы условие, стоящее после while хотя бы когда-нибудь получило значение false. В противном случае 3ds max зависнет и его придется выгружать насильно"
я как умный человек возми да и попробуй
ну у меня теперь макс вобще не запускается чё делать
Возможно скрипт который ты написал стартует при запуске макса
Автор: ja_elektronic 04/06/2006, 21:58
to Svetozar обясни на пальцах если несложно
как это преминимо сюда
я слабо в Maxscript`e соображаю
fn p = print currentTime
registerTimeCallback p
hide $object*
X = sliderTime
Command = ("UNHIDE $object" + sliderTime as string)
at time X EXECUTE Command
Автор: ja_elektronic 04/06/2006, 22:22
Палучилось урра
CODE
fn p = ( hide $object*
X = sliderTime
Command = ("UNHIDE $object" + sliderTime as string)
at time X EXECUTE Command)
registerTimeCallback p
теперь как мне отнять от имени оъекта это пресловутое "f" очень неудобно именовать объекты если там последний символ буква
Автор: scripter 04/06/2006, 22:35
так отрезаем последнюю букву от "$object_name_14f"
olds = "$object_name_14f"
news= substring olds 1 (olds.count-1)
Автор: Svetozar 04/06/2006, 22:37
ну хорошо что уже разобрался сам
лан я свалил... домой.
Автор: ja_elektronic 05/06/2006, 10:50
и так в настояещем времени скрипт выглядит так
CODE
fn p = ( hide $object*
X = sliderTime
Command = ("UNHIDE $object" + sliderTime as string)
at time X EXECUTE Command)
registerTimeCallback p
при проигрывании секвенции из объектов по кадрам
либо при перетягивании слайдер тайм ползунка
всё работает прекрасно
однако остаются 3 проблемы
1. при включении Play
функция "Command" генерирует имена объектов типа object14.5f
Естесственно таких объектов в сцнене нет и скрипт выдаёт ошибку и заканчивает работу
-- решение : нужно создать алгоритм округления значения sliderTime
***
2. всё ещё не могу прикрутить сюда отсекание одного символа String
по методу
olds = "$object_name_14f"
news= substring olds 1 (olds.count-1)
----
3. --- (опционально)
В максе объекты обычно номеруются
по типу object0000 - object0456
надо сделать какойто триггер который бы дабавлял к object1 три символа 0 пред номером объекта
к object10 два символа 0 ну и т.д.
чтото типа if string_fragment_object_number < 10 then [дописать перед числом три ноля]
если есть какие то сооброжения буду весьма признателен
а также расскажу для чего эта вся заморочка впринципе нужна
возможно кому либо это будет весма интересно
Автор: Dmitro Golub 05/06/2006, 11:11
попробуй
CODE
(sliderTime.frame+0.5) as integer
Автор: scripter 05/06/2006, 11:46
CODE
fn p =
(
TRY
(
hide $object*
X = sliderTime
OldCommand = ("UNHIDE $object" + sliderTime as string)
Command = substring OldCommand 1 (OldCommand.count-1)
at time X EXECUTE Command
)
CATCH()
)
registerTimeCallback p
отсекли ненужный символ в команде и нагло игнорируем ошибки
Автор: ja_elektronic 08/06/2006, 16:56
сейчас скрипт выглядит так
если ктонит подскажет запись по копактней буду благодарен
fn num =( TRY
( x = sliderTime.frame + 0.0001 ## здесь я определяю количество символов после запятой = 5
if x < 10.0 then (hide $object* ## здесь формирются имена объектов типа object04
OldCommand = ("UNHIDE $object0" + x as string)
Command = substring OldCommand 1 (OldCommand.count-5) ## здесь я отсекаю 5 символов
at time x EXECUTE Command
)
else ( hide $object* ## здесь формирются имена объектов типа object24
OldCommand = ("UNHIDE $object" + x as string)
Command = substring OldCommand 1 (OldCommand.count-5) ## делается это потомучто значение
at time x EXECUTE Command) ## Slidertime с плавоющим количеством
) ## символов после запятой т.е: 14.5 14.25
CATCH()
)
registerTimeCallback num
тоесть скрипт работает до объекта с именем-номером object99
Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)