Получить мировую позицию вершины TriMesh — 3ds Max SDK C #

В настоящее время я пишу плагин для моей компании, и мы хотим сместить некоторые математические операции с сетками в C #, чтобы ускорить вычисления. Я не только начинающий в C # (я парень с Python / Maxscript), но я также изо всех сил пытаюсь найти хорошую документацию SDK для 3DS Max.

Моя текущая проблема: получение относительной к миру позиции вершины в сетке. Звучит легко, но это создает некоторые проблемы для меня. Я могу получить позицию Верт, используя:

IPoint3 x = mesh.GetVert(vertID);

и для vert 3, который находится в [0,0,0] сцены, он возвращает значение Point3 [-23,86499, 17,5783, 0], вероятно, относительно … ну, центр объекта, я думаю , Или какая-то локальная матрица преобразования. То, что я хочу получить, это положение вершины в мировом пространстве, которое в данном случае, как я знаю, равно [0,0,0], а также я могу проверить его с помощью MaxScript, используя:

polyOp.getVert $ 3

Простая функция, которую я использую для поиска:

List<IINode> nodes = nodesFromHandles(objHandles);
foreach (IINode i in nodes)
{
log(i.Name);
IObjectState iState = i.EvalWorldState(0, true);
IObject iObj = iState.Obj;
IPolyObject iPoly = (IPolyObject)iObj.ConvertToType(0, global.PolyObjectClassID);
ITriObject iTri = (ITriObject)iObj.ConvertToType(0, global.TriObjectClassID);
IMesh mesh = iTri.Mesh;
for (int vertID = 0; vertID < mesh.NumVerts; vertID++)
{
IPoint3 x = mesh.GetVert(vertID); /// RETURNS A BAD POSITION? RELATIVE TO WHAT MATRIX?
log(vertID.ToString() + ": " + x.X.ToString() + ", " + x.Y.ToString() + ", " + x.Z.ToString());
}
}

Я думаю, что я должен сделать что-то с матрицей преобразования объекта, но я в неведении с этим. Работа над: 3ds Max 2014, MS Visual Studio Community 2015 (C #), Win7x64, с использованием Autodesk.Max.DLL. Любая помощь приветствуется, спасибо заранее!

Ожидаемая позиция вершины.

РЕДАКТИРОВАТЬ: (решение?)
Поправь меня, если я ошибаюсь, но, выполняя некоторые сатанинские ритуалы и жертвуя зубами, я придумал эту вещь. По сути, я в определенный момент времени получаю матрицу преобразования мира объектов (устанавливается на 0 кадр, потому что почему бы нет?), А затем выполняю точечное преобразование. Кажется, на данный момент работает довольно хорошо, но мне нужно сделать больше тестов.

List<IINode> nodes = nodesFromHandles(objHandles);
foreach (IINode i in nodes)
{
log(i.Name);
IObjectState iState = i.EvalWorldState(0, true);
IObject iObj = iState.Obj;
ITriObject iTri = (ITriObject)iObj.ConvertToType(0, global.TriObjectClassID);
IMesh mesh = iTri.Mesh;

/// OBJECT TRANSFORM MATRIX
IInterval iTimeRange = i.GetTimeRange(0);
IMatrix3 worldTm = i.GetObjTMAfterWSM(0, iTimeRange);

for (int vertID = 0; vertID < mesh.NumVerts; vertID++)
{
IPoint3 x = mesh.GetVert(vertID); /// RETURNS A BAD POSITION? RELATIVE TO WHAT MATRIX?
IPoint3 v = worldTm.PointTransform(x);
log(vertID.ToString() + ": " + v.X.ToString() + ", " + v.Y.ToString() + ", " + v.Z.ToString());
}
}

Если кто-нибудь может проверить или улучшить это — добро пожаловать. 🙂

3

Решение

Добавляем некоторые пояснения к вашему ответу. Следующая строка:

IPoint3 vertObjectSpace = mesh.GetVert(vertID);

Возвращает позицию вершины в объект пространство, которое, к сожалению, не упоминается в документации. Как вас интересуют должности в Мир пространство, вы должны преобразовать их, используя следующее:

IMatrix3 tmObj2World= i.GetObjectTM(0, iTimeRange); // where i is your IINode
IPoint3 vertWorldSpace = tmObj2World.PointTransform(vertObjectSpace);

Надеюсь, что это помогает для вашего понимания.

Некоторые заметки / дальнейшее чтение:

  • Документы о GetObjectTM а также GetObjTMAfterWSM (думаю, я бы предпочел использовать GetObjectTM, если вы явно не должны использовать GetObjTMAfterWSM):
    документ GetObjectTM
    doc GetObjTMAfterWSM
  • 3ds max использует следующие три пространства: мир, узел / локальный и объект. Для получения дополнительной информации см .: http://help.autodesk.com/view/3DSMAX/2018/ENU/?guid=__files_GUID_3B001F21_8FE9_4663_A972_E648682A0ACD_htm
  • Преобразование узла (к сожалению, не преобразование объекта) можно визуализировать в 3ds max с помощью следующего
    просмотр локального / узла тм в 3ds max
0

Другие решения

Других решений пока нет …