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

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

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

IPoint3 x = mesh.GetVert(vertID);

и для вершины 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());
    }
}

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


person bitworks    schedule 07.10.2016    source источник


Ответы (1)


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

IPoint3 vertObjectSpace = mesh.GetVert(vertID);

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

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

Надеюсь, это поможет вашему пониманию.

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

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