Render.ru

Можно на MaxScript сделать такую вещь ?

#1
Можно ли на MaxScript сделать такую вещь - создать двухмерный массив, соответствующий пикселям картинки ( X*Y ), во время рендеринга при любом рендере (Illustrate, к примеру) загнать (то есть что нибудь типа события OnRenderThisPixel) в каждый элемент массива значение
глубины (т.e.Z-bufer) и после всего закатать этот массив в файл...
Можно это сделать и как ? Нигде доков толковых на русском не могу найти...
Кстати, кто-нибудь знает - 3dMax через ActiveX Automation управляется ?
 
#2
Я кое-какие вещи делал скриптами. С удовольствием подскажу...
Только неочень понимаю что и для чего ты хочешь сделатью
Кстати подскажи, где скачать рабочий Illusyrate для МАХ4
 
#3
По поводу Illustrate для Max 4 - к сожалению, не знаю - у меня версия для 3
(версия 5.0) - где скачал, уже не помню, но могу прислать (вместе с keygen).

>что и для чего ты хочешь сделать...
что - я вроде уже объяснил выше - если не понятно, тогда спроси поконкретнее, что именно не понятно... :)

для чего - имея файл,содержащий "глубины" пикселей, то есть их z-координаты, и соответсвующий файл-отрендеренную картинку, я могу использовать картинку в качестве фона в своей программе (допустим в quest-engine) и гонять спрайты по ней, правильно определяя, попадает конкретная
точка спрайта под фон или находится перед ним - то есть иметь механизм
"захода" за объекты фона или нахождения перед ним.

***********
* *^ *****************
* ^ ^ * *
********^ * *
^^^^^^^* *
*****************
то есть вот так примерно: ^ - этими символами нарисован спрайт, * - - этими символами нарисованы объекты фона разной степени удаленности (z-координаты)
 
#4
мда.... на схему выше смотреть не рекомендую - сползло все к черту :(
 
#5
А не проще просто сохранить Z-буфер при рендере? См. RLA формат файла. Отдельно его можно вынуть в 2D граф. программе поддерживающей этот формат. Или использовать напрямую.
 
#6
Не, ну может это и покатит - но что за формат RLA ? в хелпе написано - глубина там представлена с помощью градаций серого (значит что - grayscale bitmap и 256 градаций - мало может быть) ?
Но это явно не bmp. И главное - кто его читает ? Photoshop его не знает.
Где тогда взять описание формата, чтобы самому читать ? Кроме того, если разобраться со скриптом - то при большом ко-ве картинок гемороя намного меньше (и то рендерь каждую под bmp, а потом - под RLA) - и в случае рендера последовательности кадров можно свой многокадровый файл глубин организовать - под использование с авишкой в качестве фона, например.
 
#7
Лучше надыбай по RLA описалово - накатай небольшую прогу, которая будет их него инфу вынимать и в твой тип данных конвертить, а насчет 256 цветов - это ты зря... Z-Buffer обычно описывается 16 битами, а то и всеми 32.
 
#8
не, ну можно и так - с RLA, но хотелось бы на MaxScript - заодно и поразбираться в нем. Только как начать - то есть кто нибудь конкретный пример может привести по такой задаче (или хотя бы обозначить шаги и объекты, которые нужно использовать) ?
 
#9
на данный момент нет возможности сообразить OnRenderThisPixel callback. Можно использовать #prerender and #postrender events, но невозможно вытянуть дату о текущем pixel. Попробуй вот ето - hope it helps.

-- set params
size_width = 320 -- bitmap size
size_height = 240

rendFrames = #{1,2,3} -- frames to render

my_file = Createfile "c:\\out.dat"
channelList = #(#ZDepth)
bm = bitmap size_width size_height

pxl_array = #() -- pixels in the bitmap
for i=1 to (bm.width-1) do (
for j=1 to (bm.height-1) do
append pxl_array (point2 i j)
)

for i=1 to rendFrames.count do
(
at time i
format "\n% %\n" "at frame: " i to:my_file
render to:bm channels:channelList
for j=1 to pxl_array.count do
(
ch = getChannel bm pxl_array[j] #zDepth
format "%,% \n" pxl_array[j] ch to:my_file
)

)

-- clean up
close bm
close my_file
gc()


Если ты захочешь работать с гигантскими arrays, то придется увеличить MAXScript heap. Customize->Preferense->MAXScript, by default it's 7.5 mB. Не забудь restart max
 
#11
Все бы хорошо , но FileStream.Createfile создает, как я понимаю, текстовой файл...
И format и print пишут в текстовом формате... А бинарник сделать нельзя ?
И если нет возможности записывать в бинарном формате, то есть в Maxscript
что нибудь типа функции CHR(код) ?
 
#12
Тут думал, можно в файл записывать числа, конвертируя их побайтно в соответсвующие по ASCII символы, но нет :(
Вот черт, делаю такую вещь:

char="0123456789abcdef"
for i=1 to char.count do
( s=execute("\"\\x"+char+"\"")
format "%" s to:my_file
)

ну хорошо, коды в файл он закатывает, но 0 пропускает (null terminated string, очевидно) и когда a записывает, ставит к нему в пару D (это что - пара конец строки/перевод каретки ?)... От этого можно избавиться ?
 
#13
Сергей,

Пример в help, который ты модифицировал, дает hexadecimal to ASCII а не наоборот - поетому не совсем понятно, что ты собираешься делать с half-byte? Тебе нужен BinStream для binary оутпут -> see help

f=fopen "c:\\out1.bin" "wb"
WriteString f "hello world"
WriteFloat f 128.0
fclose f
 
#14
погоди, то, что ты привел :
f=fopen "c:\\out1.bin" "wb"
WriteString f "hello world"
WriteFloat f 128.0
fclose f
Это MaxScript ? У меня версия Max 3.0 - там таких инструкций нету...
И в иерархии классов BinStream отсутствует....

>дает hexadecimal to ASCII а не наоборот - поетому не совсем понятно, что ты собираешься делать с half-byte?
Я собирался преобразовывать 32bit число в 8 hex-ов, а их с помощью execute в string из 8 байтов - и эту строку уже записывать в файл ...
 
Сверху