В настоящее время я пишу плагин для своей компании, и мы хотим перенести некоторые математические операции с сетками на 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());
}
}
Если кто-то может это проверить или улучшить - добро пожаловать. :)