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

3DMax + Script

Тема в разделе "MAXScript", создана пользователем -, 11 апр 2003.

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

    Привет,
    Признаюсь макса я не знаю, причем вообще, вчера только поставил.

    Значит неоходимо следующее:

    В своей программе по моделированию атомных взаимод. я считаю координаты каждого атома (некий 3х мерный куб) и каждый шаг расчета пишу координаты каждого атома в 3и файла X Y Z.

    Нужно чтобы макс считал все файлы (они гигантские ~10Мб, обычный текст, одна цифра в строке) и каждая считаная координата по X Y Z являлась центром сферы и в соответствии с изменением координат в файле, перемещала центры сфер и соответственно сами сферы. Всякие текстуры свет и прочие максовы навороты не нужны.

    Ну и совсем круто было бы если бы скрипт прочитал еще 3 файла где хранятся координаты сфер которые необходимо закрасить в отличный от других сфер цвет.

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

    Если не трудно кто мог бы помочь?
     
  2. Guest

    Скрипт несложный, если надо только считать к-ты сфер и расставить их. Если есть файлы покороче (пробные) - пришли мне, попробуем что-нибудь придумать
     
  3. Guest

    ответил на почту :)
     
  4. Guest

    На сколько я понял у тебя инфо по каждому атому разбивается на 3 файла, каждый из которых около 10М ?
    Итого имеем 3*10*N Mб - что то мне подсказывает, что макс такое не потянет.

    Советую все же писать на C++ и немного изменить формат твоих данных.
    Структура файла должна быть такая:
    [
    TimeStep
    [Atom coord]
    ]

    [] - множество.

    TimeStep:
    2 байта - идентификатор единици времени (меняется от 0 до T)
    2 бата - длина [Atom coord]

    Atom coord:
    2 байта - идентификатор атома
    2 байта - X
    2 байта - Y
    2 байта - Z

    Таким образом обработка сводится к следующему алгоритму (пишу на псевдо (!!!) C):

    fopen( "file" );
    int fileSize = file.size();
    int pos = 0;
    while( pos < fileSize )
    {
    short ts = fread( file, pos, 2 ); // читаем time id, пока он нам не нужен
    pos += 2;
    short offset = fread( file, pos, 2 );// читаем смещение до следующего ts
    pos +=2;
    char someBuffer[] = fread( file, pos, offset ); // читаем все координаты для текущего ts
    Proccess( someBuffer, offset ); // обработка координат.
    pos += offset; // переходим к следующему ts
    }

    class Atom
    {
    SetCoord( short X, short Y, short Z );
    }; // см. комментарии ниже

    map<short, Atom*> atoms; // см. комментарии ниже

    Process( char* buffer, int size )
    {
    int pos = 0;
    while( pos < size )
    {
    // получаем id
    short id;
    char* pid = (char*)&id;
    pid[0] = buffer[pos];
    pid[1] = buffer[pos + 1];

    pos += 2;
    // Получаем X, Y, Z так же как id
    short X,Y,Z;
    ...

    // Теперь у нас должен быть некий список существующих атомов.
    // Его лучше реализовать с помощью map, это класс из STL

    // Проверяем, есть ли такой атом в нашем списке
    map<>::iterator it = atoms.find( id );
    if( it != atoms.end() )
    {
    // Такой атом уже есть. Устанавливаем ему новые значения координат.
    Atom* patom = *it;
    patom->SetCoord( X,Y,Z );
    }
    else
    {
    // Атома с этим id еще нет, создадим его
    Atom* patom = new Atom;
    patom->SetCoord( X,Y,Z );
    pair< short, Atom* > pa;
    pa.first = id;
    pa.second = patom;

    map.push_back( pa );
    }
    }

    // Итак мы установили все новые координаты.
    // Теперь можно сделать BitBlt

    BitBlt();
    }

    Как видишь, обработка такого файла достаточно проста.
    Теперь на счет прорисовки. Очень простая в использовании библиотека OpenGL, советую использовать её.
    Прорисовку атомов советую делать в неотображаемый буфер в ф-ии Atom::SetCoord.
    А ф-ией BitBlt() перегонять пикселы из невидимого буфера в отображаемый, таким образом ты избежишь мерцания и не увидишь промежуточных состояний, когда атом 1 уже переместился а атом 2 еще на месте, ведь перемещения должны произойти одновременно.

    Повторюсь еще раз: это не программа на C++, это псевдо код !

    Если задача еще актуальна - пиши, договоримся.
     
  5. Wovlad

    Wovlad Пользователь сайта

    С нами с:
    17.09.2008
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    2
    Здравствуйте.
    появилась задача сделать скрипт управляющий пальцами руки персонажа для Attribute Holder, который будет назначаться контроллеру ладони. Частично задачу решил, взяв скрипт управления ступней из уроков CG Academy по ригу и изменив его под себя, однако он работает криво, и хотелось бы вместо счетчиков для управления иметь ползунки (в идеале и то и другое) так же сделать отдельный слайдер для управления сразу всеми пальцами, т.е. значение одного слайдера = значение 4-х слайдеров.
    Знаю что задача совсем не сложная, но туторов на эту тему нагуглить немогу. подскажите пожалуйста, кто сталкивался с задачей, где бы найти информацию на эту тему, или есть ли в свободном доступе подобные скрипты?
    Заранее благодарен.
     
  6. Wovlad

    Wovlad Пользователь сайта

    С нами с:
    17.09.2008
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    2
Модераторы: Savin Denis

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