Render.ru

3DMax + Script

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

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

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

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

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

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

Если не трудно кто мог бы помочь?
 
#2
Скрипт несложный, если надо только считать к-ты сфер и расставить их. Если есть файлы покороче (пробные) - пришли мне, попробуем что-нибудь придумать
 
#4
На сколько я понял у тебя инфо по каждому атому разбивается на 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++, это псевдо код !

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

Wovlad

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