Render.ru

Вопросы по Max Script (всего понемногу)

Paul_Winex

Знаток
Рейтинг
20
#21
Приветствую. Почти дописал скрипт по пакетному рендерингу сцен с подгрузкой их в студию. Осталось пара мелочей и одна глобальная задача - сделать код который создает список максовских файлов из указанной дериктории + поддериктории. Можете посоветовать что-нибудь?
Поясню - жмакаю кнопу, открывается диалог, там жмакаю папку и потом ОК, открывается скриптовый диалог с полными путями находящихся внутри указанной папки файлов. Либо просто сразу записывается в текстдок. но мне нужен совет по функции получаения адресов в директории
 

ASK'R

Активный участник
Рейтинг
5
#22
fn walkDir dir pattern =
(
dirArr = GetDirectories (dir + "\\*")
for d in dirArr do
(
join dirArr (getDirectories (d + "\\*"))
)
append dirArr (dir + "\\") -- Need to include the original top level directory
for f in dirArr do
(
join fileListing (getFiles (f + pattern))
)
)

пример вызова: walkDir (CheckPath.text as string) "*.max"

я сбор инфы с этим делал, примерно 750м (да да, за 3 года то накопилось сцен..) файле макс валится - мелкие утечки памяти видимо его добивают

где-то поглядет можно будет?
 

Castello

Активный участник
Рейтинг
5
#25
Создал listbox:
Код:
listbox lbx1 "Objects:" pos:[8,155] width:147 height:8
под ним создал кнопку для добавления объектов в мой listbox

Код:
button btn2 "Add Selected" pos:[8,288] width:84 height:23
добавляю объекты:

Код:
on btn2 pressed do
	(
		lbx1.items = for obj in selection where (classof obj == Editable_Poly) or (classof obj == Editable_Mesh) collect obj.name
	)
работает, но как реализовать само добавление объектов в listbox, т.е. в массив obj ?
если массив пуст (если ничего не выбрано) то при btn2 pressed, все правильно добавляется в массив obj и отображается в listbox, НО если сразу после этого добавить еще объектов, то массив тупо заменяется именами новых объектов, и при этом никакого добавления не происходит.
 

Castello

Активный участник
Рейтинг
5
#27
+= действительно добавляет, но теперь встает другая проблема - получается одни и те же объекты можно добавлять в массив сколько угодно раз, а это не допустимо.
как избежать повторного добавления объектов?
и причем не просто с одинаковыми именами, а реально разных, чтобы выбирая два разных объекта с одинаковыми именами они добавлялись в массив (а от туда в listbox), а объект который уже был добавлен, не добавлялся
 

igorznag

Мастер
Рейтинг
103
#28
Создаем вспомогательный Listbox. Его можно спрятать (visible=false).
Код:
rollout test "Test"
(
listbox lbx1 "Objects names:" pos:[8,155] width:147 height:8
listbox lbx1_id "Objects id:" pos:[200,155] width:147 height:8
button btn2 "Add Selected" pos:[8,288] width:84 height:23
on btn2 pressed do 
(
lbx1_items=lbx1.items; lbx1_id_items=lbx1_id.items;
for obj in selection where (classof obj == Editable_Poly) or (classof obj == Editable_Mesh) do
(
temp=0;
for obj_id in lbx1_id_items do if(obj.inode.handle==(obj_id as integer))then (temp=1;exit;)
if(temp==0)then (append lbx1_items obj.name; append lbx1_id_items (obj.inode.handle as string);)
)--for obj in selection where ...
lbx1.items=lbx1_items; lbx1_id.items=lbx1_id_items;
)--on btn2 pressed do 
)--rollout test "Test"
createDialog test 400 400
 

Castello

Активный участник
Рейтинг
5
#29
Попробовал сделать так:

Код:
on btn2 pressed do
	(
		for i = 1 to selection.count do
		(
			if (classof selection[i] == Editable_Poly) or (classof selection[i] == Editable_Mesh) do
			(
				append obj selection[i].name
			)
		)
		lbx1.items = obj
	)
вроде работает)
 

Castello

Активный участник
Рейтинг
5
#30
Такой вопрос:

создал утилиту и вывел её на панель Utilities

Код:
utility foo "Utility"
(

)
openUtility foo
как мне теперь добавить в мою утилиту свиток?
утилита сама посебе представляет собой свиток на панели Utilities, так вот надо в этот свиток добавить еще один.
 

Castello

Активный участник
Рейтинг
5
#31
Код:
on btn2 pressed do 
 ( 
 for i = 1 to selection.count do 
 ( 
 if (classof selection[i] == Editable_Poly) or (classof selection[i] == Editable_Mesh) do 
 ( 
 append obj selection[i].name 
 ) 
 ) 
 lbx1.items = obj 
 )
как мне после append obj selection.name, пройтись по массиву obj и убрать повторяющиеся объекты (.inode.handle) ?
 

Castello

Активный участник
Рейтинг
5
#32
Попробовал так:

Код:
		if obj != #() then
		(
			for i = 1 to obj.count do
			(
				for k = 1 to obj.count do
				(
					if obj[i].inode.handle = obj[k].inode.handle then deleteItem obj i
				)
			)
		)			
		lbx1.items = for i in obj collect i.name
неработает(
помогите
 
Рейтинг
31
#33
Код:
rollout selRollout "Untitled" width:162 height:300
(
	
	local objList = #()
	local objNameList = #()
	
	button btn1 "Add from selection" pos:[7,6] width:142 height:22
	listBox lbx1 "Objects" pos:[8,35] width:144 height:18
	
	on btn1 pressed  do (
		for obj in selection where (classof obj == Editable_Poly) or (classof obj == Editable_Mesh) do (
			appendIfUnique objList obj
		)
		objNameList = for obj in objList collect obj.name
		sort objNameList
		lbx1.items = objNameList
	)
)

CreateDialog selRollout
Так?
 

Klask

Пользователь сайта
Рейтинг
2
#34
Привет всем)
Хотел спросить по поводу Rotation Script Controller.
При настройке Rotation script мы управляем через Quat 0 [X,Y,Z] Но он как-то некорректно работает) С искажениями. Как будто это я вращаю объект по каким-то остаточным погрешностям, а не по абсолютным значениям.
И еще я ищу скрипт эмулирующий работу Link Tool
 

igorznag

Мастер
Рейтинг
103
#35
При настройке Rotation script мы управляем через Quat 0 [X,Y,Z] Но он как-то некорректно работает)
Предоставьте пример скрипта.
И еще я ищу скрипт эмулирующий работу Link Tool
Вы имеете в виду инструмент Select and Link?
 

Klask

Пользователь сайта
Рейтинг
2
#36
Предоставьте пример скрипта.
C_RX = $Camera001.rotation.controller.'X Rotation'
C_RY = $Camera001.rotation.controller.'Y Rotation'
C_RZ = $Camera001.rotation.controller.'Z Rotation'

X = C_RX
Y = C_RY
Z = C_RZ
quat 1 X Y Z

Входные значения:
C_RX = 90
C_RY = 0
C_RZ = 0
Выходные значения:
quat 1 90 0 360

Сам объект повернулся только на 45 градусов.

Вы имеете в виду инструмент Select and Link?
Да
 

igorznag

Мастер
Рейтинг
103
#37
1. (Что, вообще, должен делать скрипт?) Такой вариант подходит?
Код:
C_RX = $Camera001.rotation.controller.'X Rotation' 
C_RY = $Camera001.rotation.controller.'Y Rotation' 
C_RZ = $Camera001.rotation.controller.'Z Rotation'
X = C_RX 
Y = C_RY 
Z = C_RZ 
(eulerAngles X Y Z) as quat
2. Используйте свойства объектов parent и children.
 

Klask

Пользователь сайта
Рейтинг
2
#38
Да, теперь все работает отлично, спасибо огромное)
Что, вообще, должен делать скрипт?)
Я сейчас пытаюсь описать работу привязки объекта к камере с особыми условиями. Объект должен находиться во всей области захвата камеры и перемещаться вместе с ней, но при изменении дистанции между камерой и объектом он должен изменять свой размер не меняя своей позиции. Иными словами он должен находиться всегда в 0й точке координат. Движение камеры прописано таким образом, что 0я точка координат будет все время в поле ее зрения.
 

Klask

Пользователь сайта
Рейтинг
2
#39
Я описал движение объекта, находящегося перед камерой, но только для 2х осей, проблема возникает в том, что при повороте 3й оси система координат тоже меняется и это ставит в небольшой тупик.
C_RX = $Camera001.rotation.controller.'X Rotation'
C_RY = $Camera001.rotation.controller.'Y Rotation'
C_RZ = $Camera001.rotation.controller.'Z Rotation'

X = sin(C_RZ)*cos(C_RX)
Y = cos(C_RX)*cos(C_RZ)
Z = sin(C_RX)
[ X, Y, Z ]

Есть ли возможность изменить систему координат? Или может кто-нибудь дописать скрипт на 3ю ось?

P.S. Parent и children. не помогают, т.к. не предоставляют полного контроля.
 

Klask

Пользователь сайта
Рейтинг
2
#40
Есть ли возможность узнать векторное направление объекта? Скажем, угол направления обзора камеры?
 
Сверху