1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Общие вопросы", создана пользователем -, 14 мар 2002.

Модераторы: Артер
  1. Guest

    Можно ли на MaxScript сделать такую вещь - создать двухмерный массив, соответствующий пикселям картинки ( X*Y ), во время рендеринга при любом рендере (Illustrate, к примеру) загнать (то есть что нибудь типа события OnRenderThisPixel) в каждый элемент массива значение
    глубины (т.e.Z-bufer) и после всего закатать этот массив в файл...
    Можно это сделать и как ? Нигде доков толковых на русском не могу найти...
    Кстати, кто-нибудь знает - 3dMax через ActiveX Automation управляется ?
     
  2. Guest

    Я кое-какие вещи делал скриптами. С удовольствием подскажу...
    Только неочень понимаю что и для чего ты хочешь сделатью
    Кстати подскажи, где скачать рабочий Illusyrate для МАХ4
     
  3. Guest

    По поводу Illustrate для Max 4 - к сожалению, не знаю - у меня версия для 3
    (версия 5.0) - где скачал, уже не помню, но могу прислать (вместе с keygen).

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

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

    ***********
    * *^ *****************
    * ^ ^ * *
    ********^ * *
    ^^^^^^^* *
    *****************
    то есть вот так примерно: ^ - этими символами нарисован спрайт, * - - этими символами нарисованы объекты фона разной степени удаленности (z-координаты)
     
  4. Guest

    мда.... на схему выше смотреть не рекомендую - сползло все к черту :(
     
  5. Guest

    А не проще просто сохранить Z-буфер при рендере? См. RLA формат файла. Отдельно его можно вынуть в 2D граф. программе поддерживающей этот формат. Или использовать напрямую.
     
  6. Guest

    Не, ну может это и покатит - но что за формат RLA ? в хелпе написано - глубина там представлена с помощью градаций серого (значит что - grayscale bitmap и 256 градаций - мало может быть) ?
    Но это явно не bmp. И главное - кто его читает ? Photoshop его не знает.
    Где тогда взять описание формата, чтобы самому читать ? Кроме того, если разобраться со скриптом - то при большом ко-ве картинок гемороя намного меньше (и то рендерь каждую под bmp, а потом - под RLA) - и в случае рендера последовательности кадров можно свой многокадровый файл глубин организовать - под использование с авишкой в качестве фона, например.
     
  7. Guest

    Лучше надыбай по RLA описалово - накатай небольшую прогу, которая будет их него инфу вынимать и в твой тип данных конвертить, а насчет 256 цветов - это ты зря... Z-Buffer обычно описывается 16 битами, а то и всеми 32.
     
  8. Guest

    не, ну можно и так - с RLA, но хотелось бы на MaxScript - заодно и поразбираться в нем. Только как начать - то есть кто нибудь конкретный пример может привести по такой задаче (или хотя бы обозначить шаги и объекты, которые нужно использовать) ?
     
  9. Guest

    на данный момент нет возможности сообразить 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
     
  10. Guest

    Very thanks, plug
     
  11. Guest

    Все бы хорошо , но FileStream.Createfile создает, как я понимаю, текстовой файл...
    И format и print пишут в текстовом формате... А бинарник сделать нельзя ?
    И если нет возможности записывать в бинарном формате, то есть в Maxscript
    что нибудь типа функции CHR(код) ?
     
  12. Guest

    Тут думал, можно в файл записывать числа, конвертируя их побайтно в соответсвующие по 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. Guest

    Сергей,

    Пример в 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. Guest

    погоди, то, что ты привел :
    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 байтов - и эту строку уже записывать в файл ...
     
  15. Guest

    Пардон, не в 8, а в четыре... :)
     
Модераторы: Артер

Поделиться этой страницей