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

Управление сценой из внешнего файла

Тема в разделе "MAXScript", создана пользователем Tesla, 29 мар 2009.

Модераторы: Savin Denis
  1. Tesla

    Tesla Активный участник

    С нами с:
    08.01.2009
    Сообщения:
    149
    Симпатии:
    0
    Баллы:
    13
    Здравствуйте, я увлекаюсь, в основном моделированием, но до скриптов руки не доходили. И вот дошло до того, что мне дали задание по Maxscript... в принципе, звучит элементарно (наверное, и на деле также). Я просмотрел большинство тем, не нашел ничего схожего.
    Суть задания:
    Во внешнем файле (не в среде Макса) нужно вбивать координаты двух параллелепипедов. Затем нужно расставить источники света, отрендерить изображение и сохранить его в формате Jpg.
    В принципе, все. Но я не могу понять, что из себя должен представлять внешний файл... то ли это координаты вбиваются в блокнот, то ли нужно создать отдельную программку со своим интерфейсом, и как это все связать с Максом. Уж как там источники света расставить я разберусь, а вот что до внешнего файла и рендера хотелось бы услышать пару советов.
    Если что-то нужно пояснить, спрашивайте.
    Спасибо.
     
  2. Tesla

    Tesla Активный участник

    С нами с:
    08.01.2009
    Сообщения:
    149
    Симпатии:
    0
    Баллы:
    13
    Поправочка: координаты источников света тоже должны быть прописаны в файле. Насчет рендера не знаю... если придется делать отдельную программку, то, скорей всего, нужно сделать кнопку для визуализации и сохранения в файл jpg. Но тут вам лучше знать, я думаю.
     
  3. Tesla

    Tesla Активный участник

    С нами с:
    08.01.2009
    Сообщения:
    149
    Симпатии:
    0
    Баллы:
    13
    Так, теперь я уточнил некоторые вещи. В качестве внешнего файла является обычный блокнот. Т.е. вбиваем туда числа, а затем нужно произвести чтение из файла координат параллелепипеда.
     
  4. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    1) Если координаты будут вбивать вручную то бери Excel-вскeю таблицу (Блокнот плох тем что нет вобще никакого форматирования, лишний символ и все поехало )
    3) Определись со списком объектов и их параметрами
    4) Создай шаблон для Excel Чтоб для каждого параметра была своя ячейка
    5) Сохраняй в .csv формате
    6) Когда будет определен формат можно писать для него парсер
    Что читать:
    External File Access - Topics Index
    FileStream Values
    String Values
    Reading_ASCII Files
    How To ... Read Geometry Data From Text File - Part One
    How To ... Access Windows System Data
    Standard Open and Save File Dialogs

    7) Создание и модификация объектов: По началу помогает включение MacroRecordera
    Также смотрим параметры объектов в хелпе
    Что читать:
    Node Transform Properties
    Node Common Properties, Operators, and Methods
    Drawing a Box with MAXScript
    Modifying the Box
    Applying Standard Transformations

    8) Render:
    Как отрендерить в файл:
    Код:
    render camera:$Camera01 outputSize:[320,240] outputFile:("c:\\test.jpg") 
    Что читать:
    Rendering - Topics Index
    Controlling the Renderer

    9) Повесить на кнопку: нужно обернуть как macroscript
    Что читать:
    Defining MacroScripts
    Developing MacroScripts - Topics Index
     
  5. Tesla

    Tesla Активный участник

    С нами с:
    08.01.2009
    Сообщения:
    149
    Симпатии:
    0
    Баллы:
    13
    Спасибо. Буду изучать
     
  6. Tesla

    Tesla Активный участник

    С нами с:
    08.01.2009
    Сообщения:
    149
    Симпатии:
    0
    Баллы:
    13
    Наконец-то выдалось время заняться решением этой задачи.
    С рендерингом в файл никаких проблем нет. Возникли вопросы, связанные с чтением координат центра объекта. Сейчас я процитирую 2 варианта записи/чтения данных, которые я раздобыл в хелпе макса, и которые вызвали несколько вопросов.

    Вариант №1
    Запись в файл:

    stream = fopen "c:\\bintest2.bin" "wb"
    num = getnumVerts $box01
    for i = 1 to num do
    (
    pos = getVert $Box01 i
    writeString stream (pos.x as string)
    writeString stream (pos.y as string)
    writeString stream (pos.z as string)
    )
    fclose stream

    ***

    Чтение из файла:

    stream = fopen "c:\\3dwork\\prim_Data.txt" "rb"
    num = getnumVerts $Box01
    pos = [0, 0, 0]
    for i = 1 to num do
    (
    pos.x = readFloat stream
    pos.y = readFloat stream
    pos.z = readFloat stream --(*) ошибка
    setVert $Box01 i pos
    )
    fclose stream
    update $Box01

    -------
    запись работает нормально, а в чтении "ругается":

    (*)
    <BinStream:c:\3dwork\prim_Data.txt>
    8
    [0,0,0]
    -- Error occurred in i loop; filename: C:\3dwork\reading_file.ms; position: 204
    -- Frame:
    -- i: 1
    -- Unable to convert: undefined to type: Float
    true
    OK
    ___________
    Проблема, собственно, вот в чем: прежде чем произвести какие-то манипуляции, нужно конвертировать объект в Mesh. Скрипт записывает в файл координаты каждой вершины, а мне нужно только центр объекта, типа pos = [x,y,z] (и в файле менять эти x, y, z). Но данный способ записывает в файл координаты, как бинарный код, а обычный блокнот такое не считывает, да и управлять объектом становится неимоверно тяжело

    ***
    Вариант №2
    Привожу второй вариант из хелпа, который записывает координаты в блокнот, но также требует преждевременной конвертации в Mesh.

    Запись в файл:

    tm = snapshotAsMesh $Object01 -- Записываем в файл первый примитив
    out_name = ((GetDir #export)+"/testmesh.txt") -- Назначаем директорию и название файла
    out_file = createfile out_name -- создаем файл
    num_verts = tm.numverts
    num_faces = tm.numfaces

    format "%,%\n" num_verts num_faces to:eek:ut_file --%,% - число вершин и граней; \n - перенос
    for v = 1 to num_verts do -- цикл для просчета вершин
    (
    vert = getVert tm v
    format "%," vert to:eek:ut_file
    )
    format "\n" to:eek:ut_file
    for f = 1 to num_faces do -- цикл для просчета граней
    (
    face = getFace tm f
    format "%," face to:eek:ut_file
    )
    close out_file -- закрываем созданный файл
    delete tm
    edit out_name

    ***

    Чтение из файла:

    vert_array = #()
    face_array = #()
    in_name = ((GetDir #export)+"/testmesh.txt")
    in_file = openFile in_name
    if in_file != undefined then
    (
    num_verts = readValue in_file
    num_faces = readValue in_file
    vert_array.count = num_verts
    face_array.count = num_faces
    for v = 1 to num_verts do
    (
    vert = readValue in_file
    vert_array[v] = vert
    )
    for f = 1 to num_faces do
    (
    face = readValue in_file
    face_array[f] = face
    )
    close in_file
    new_mesh = mesh vertices:vert_array faces:face_array
    )

    ______________

    опять же не понятно, как управлять конкретно центром объекта и такими объектами, как источники света и камеры

    есть еще несколько вопросов, но сначала нужно решить основной вопрос (управление центром объектов из текстового файла)
     
  7. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Прежде внимательней смотри то что я по рекомендовал, похоже что ты посмотрел не все.
    Там есть и управление положением объекта. И не нужно строить (сохранять) параметрический объект по точкам, еще раз напоминаю о макрорекордере те параметры что в нем не видны смотрим в хелпе.
     
Модераторы: Savin Denis

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