Render.ru

3dsmax 4.2 sdk question

#1
добрый день всем,
кто-нибудь знает форум разработчиков плагинов для макса? есть вопрос, не знаю, уместно ли его здесь задавать. можно отвечать по почте

артем.
 
#3
в максе построены два разных объекта и оториентированы каким-то образом друг относительно друга. в методе callback() при перечислении узлов ( nodes ) я делаю

ObjectState os = node->EvalWorldState( iptr->GetTime( ), FALSE );
TriObject* t = (TriObject*) os.obj;
Mesh* mesh = &t->mesh;

и двльше получаю координаты вершин и связку треугольников. в help сказано, что это позволит получить координаты объектов после прохождения всей pipeline, такими, какими они выглядят на экране. вот с этим и проблема. ряд объектов оказывается неправильно отмасштабированным, ряд - оказываются не в том месте. матрицы преобразований у каждого узла единичные.

где хранится смещение объекта, его масштаб и как узнать, относительно какого объекта он смещен?

заранее благодарен. артем.
 
#4
Артем

по поводу object trasnform смотри SDK help->The Node and Object Offset Transformations
по pipeline: попробуй search on EvalWorldState в ..\maxsdk\samples - наверняка найдешь то цтхо ишцешь


hope it helps
 
#5
Да, это именно оно. Я так и подозревал. Уже сделал. Меня смутили две вещи из SDK hekp

1)Prototype:

virtual const ObjectState& EvalWorldState(TimeValue time,BOOL evalHidden=TRUE)=0;

Remarks:

This method should be called when a developer needs to work with an object that is the result of the node's pipeline. This is the object that the appears in the scene.

Но это оказалось неправдой ;-))

2) A developer can retrieve the entire transformation of the object-offset, node and parent using the INode method:

virtual Matrix3 GetObjectTM(TimeValue time, Interval* valid=NULL)=0;

This is the entire transformation of a node. When an object is actually translated into world space, this is the matrix used. This is the Object Offset Transformation, plus the NodeTM, plus the world space modifier effect.

Логично предположить, что вызова

Matrix3 tm = node->GetObjectTM( iptr->GetTime( ) );
Point3 tp = VectorTransform( tm, mesh->verts );

хватит для получения уже окончательных координат. Ан нет, приходится делать

Point3 off = tm.GetRow( 3 );
myobj->vlist.set( tp.x+off.x, tp.y+off.y, tp.z+off.z, ocount );

что очень странно. Почему трансляцию нельзя сделать в VectorTransform(), ведь вся информация имеется?

Спасибо в любом случае.
 
Сверху