Render.ru

Мне нужен скрипт, записывающий в txt файл инфу по расположению моделей в сцене

Castello

Активный участник
Рейтинг
5
#1
Мне нужен скрипт, записывающий в текстовый файл информацию по расположению выделенных моделей в сцене

К примеру, в сцене имеем несколько объектов, скрипт должен записать в текстовый файл, название модели/координты x.y.z. / а также углы вращения по координатам x.y.z
выделенных объектов, в таком вот виде:

Название: Координаты X,Y,Z: Углы вращения X,Y,Z:

Код:
object1 [12.23,45.56,78.9] [0,0,-135]
object2 [21.32,54.65,87.9] [0,0,90]
object3 [1,1,1] [0,0,0]
3ds Max 2012 x64 SP2

Зарание спасибо
 

igorznag

Мастер
Рейтинг
103
#2
В новой сцене создайте один объект чайник (Teapot), установите какие-нибудь координаты положения, вращения.
Сохраните его координаты с помощью скрипта из этой ТЕМЫ. Проверьте если координаты правильно сохраняются.
 

Castello

Активный участник
Рейтинг
5
#3
В новой сцене создайте один объект чайник (Teapot), установите какие-нибудь координаты положения, вращения.
Сохраните его координаты с помощью скрипта из этой ТЕМЫ. Проверьте если координаты правильно сохраняются.
Код:
outFile = getSaveFileName caption:"Safe coords.:" types:"Coords. list (*.txt)|*.txt|All Files (*.*)|*.*|" 

if outFile != undefined then 
( 
outFile = createfile outFile 
for i in objects do 
( 
 pos2 = i.pos 
 rot1 = i.rotation as eulerAngles 
 rot2 = [rot1.x,rot1.y,rot1.z] 

 format "% %\n" pos2 rot2 to:outFile 
); 
close outFile 
);
Нет, этот скрипт мне не подходит - он не сохраняет имена объектов, а координаты X.Y.Z вообще непонятно от куда берет, и еще что касается углов вращения - у меня в сцене угол объекта = 0,0,-135, а этот скрипт сохраняет как 0,0,135 (он забыл минус "-", а в моем случае это критично)

вот так вот выглядит моя сцена:

http://rghost.ru/35794166/image.png

объект Teapot001
координаты [12.34,56.78,9]
вращение [0,0,-135]

а скрипт при этом мне выдал

Код:
[485.827,2235.43,354.331] [0,0,135]
нету имени объекта, координаты выообще не соответсвуют, угол без минуса...

уточню - скрипт должен писать координты учитывая те параметры Unit Setup, которые стоят в данный момент сцены, на скриншоте видно какаие у меня параметры
 

igorznag

Мастер
Рейтинг
103
#4
Попробуйте этот вариант скрипта. Display unit scale должен быть Metric:Meters.
Сначала выделяем нужные объекты и потом запускаем скрипт:
Код:
fn precision_3 n= (return (floor (n*1000))/1000)
if(selection.count>0)then
(
outFile = getSaveFileName caption:"Save coords.:" types:"Coords. list (*.txt)|*.txt|All Files (*.*)|*.*|" 
if outFile != undefined then 
( 
outFile = createfile outFile 
for i in selection do 
(
obj_name=i.name; obj_pos=[precision_3 i.pos.x,precision_3 i.pos.y, precision_3 i.pos.z]
if(units.DisplayType==#Metric and units.MetricType==#Meters)then
(
s=(units.formatValue i.pos.x); s_array=filterString s "m";obj_pos_x=s_array[1];
s=(units.formatValue i.pos.y); s_array=filterString s "m";obj_pos_y=s_array[1];
s=(units.formatValue i.pos.z); s_array=filterString s "m";obj_pos_z=s_array[1];
obj_pos="["+obj_pos_x+","+obj_pos_y+","+obj_pos_z+"]";
)
obj_rot_x=precision_3 i.rotation.x_rotation; obj_rot_y=precision_3 i.rotation.y_rotation;
obj_rot_z=precision_3 i.rotation.z_rotation; obj_rot=[obj_rot_x,obj_rot_y,obj_rot_z];
format "% % %\n" obj_name obj_pos obj_rot to:outFile 
); 
close outFile 
);
);
 

Castello

Активный участник
Рейтинг
5
#5
Код:
Teapot001 [-0,607,1,618,5,1] [0,0,-135]
Почти то что надо, единственный ньюанс - в записии X,Y,Z координат моделей получается неразбериха - [-0,607,1,618,5,1]
Нужно чтобы скрипт записывал делитель дробной части не запятой "," а точкой ".", т.е. должно было получится вот так"
Код:
Teapot001 [-0.607,1.618,5.1] [0,0,-135]
 

igorznag

Мастер
Рейтинг
103
#6
Код:
fn sep n= (f=filterString n ",";if(f.count==2)then n=f[1]+"."+f[2];return n;)
fn precision_3 n= (return (floor (n*1000))/1000)
if(selection.count>0)then
(
outFile = getSaveFileName caption:"Save coords.:" types:"Coords. list (*.txt)|*.txt|All Files (*.*)|*.*|" 
if outFile != undefined then 
( 
outFile = createfile outFile 
for i in selection do 
(
obj_name=i.name; obj_pos=[precision_3 i.pos.x,precision_3 i.pos.y, precision_3 i.pos.z]
if(units.DisplayType==#Metric and units.MetricType==#Meters)then
(
s=(units.formatValue i.pos.x); s_array=filterString s "m";obj_pos_x=sep s_array[1];
s=(units.formatValue i.pos.y); s_array=filterString s "m";obj_pos_y=sep s_array[1];
s=(units.formatValue i.pos.z); s_array=filterString s "m";obj_pos_z=sep s_array[1];
obj_pos="["+obj_pos_x+","+obj_pos_y+","+obj_pos_z+"]";
)
obj_rot_x=precision_3 i.rotation.x_rotation; obj_rot_y=precision_3 i.rotation.y_rotation;
obj_rot_z=precision_3 i.rotation.z_rotation; obj_rot=[obj_rot_x,obj_rot_y,obj_rot_z];
format "% % %\n" obj_name obj_pos obj_rot to:outFile 
); 
close outFile 
);
);
 

Castello

Активный участник
Рейтинг
5
#8
А как теперь зделать так чтобы углы вращения записывались в кватернионах?
Прим:
Код:
Teapot001 [-0.607,1.618,5.1] [0.70710677,0,0,0.70710677]
 

igorznag

Мастер
Рейтинг
103
#9
Код:
fn sep n= (f=filterString n ",";if(f.count==2)then n=f[1]+"."+f[2];return n;) 
fn precision_3 n= (return (floor (n*1000))/1000) 
if(selection.count>0)then 
( 
outFile = getSaveFileName caption:"Save coords.:" types:"Coords. list (*.txt)|*.txt|All Files (*.*)|*.*|" 
if outFile != undefined then 
( 
outFile = createfile outFile 
for i in selection do 
( 
obj_name=i.name; obj_pos=[precision_3 i.pos.x,precision_3 i.pos.y, precision_3 i.pos.z] 
if(units.DisplayType==#Metric and units.MetricType==#Meters)then 
( 
s=(units.formatValue i.pos.x); s_array=filterString s "m";obj_pos_x=sep s_array[1]; 
s=(units.formatValue i.pos.y); s_array=filterString s "m";obj_pos_y=sep s_array[1]; 
s=(units.formatValue i.pos.z); s_array=filterString s "m";obj_pos_z=sep s_array[1]; 
obj_pos="["+obj_pos_x+","+obj_pos_y+","+obj_pos_z+"]"; 
) 

obj_rot_x=precision_3 i.rotation.x; obj_rot_y=precision_3 i.rotation.y; 
obj_rot_z=precision_3 i.rotation.z; obj_rot_w=precision_3 i.rotation.w; 
obj_rot=[obj_rot_x,obj_rot_y,obj_rot_z,obj_rot_w]; 
format "% % %\n" obj_name obj_pos obj_rot to:outFile 
); 
close outFile 
); 
);
 

jumo

Знаток
Рейтинг
23
#10
Спасибо за ответ!

Запускаю скирпт, выделяю Теапот01, показывает ошибку:

-- Error occurred in <handler>()
-- Frame:
-- hide_unhide: undefined
-- obj: $Teapot01
>> MAXScript Change Handler Exception: -- Type error: Call needs function or class, got: undefined <<
 
Сверху