Создание групп сглаживания из жестких краев в плагине 3ds max

Мне нужно реализовать средство импорта в 3ds Max, которое будет загружать некоторые пользовательские данные сетки. Я реализовал большую часть кода загрузки, но мне еще нужно решить одну проблему.

Формат данных, который мне нужно использовать, использует структуры, называемые «жесткими краями», для описания гладкости поверхности, но 3ds Max использует «группы сглаживания», и хотя оба подхода работают очень хорошо, мне нужно каким-то образом преобразовать один во второй.

По сути, у меня есть некоторые вершины/грани сетки, загруженные в 3ds, теперь мне нужно вычислить группы сглаживания для этих граней на основе списка жестких ребер в моем файле.

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

Пробовал искать в гугле и т.д., есть много туториалов и статей о группах сглаживания, но с точки зрения пользователя 3ds Max (моделирование). Я не могу найти ничего о том, чтобы сделать то же самое с кодом (и я не спрашиваю об API для этого, я знаю API, но мне нужен алгоритм для вычисления SG).


person kolenda    schedule 07.01.2013    source источник


Ответы (1)


Хорошо, я нашел обходной путь...

Он использует внутренний код 3D MAX вместо моего собственного, но, по крайней мере, он работает:

Предположим, у меня есть список или вектор граничных структур:

struct Edge
{
    int nEd0;
    int nEd1;
};

И функция для проверки наличия ребра в списке:

bool findHardEdge( int v1, int v2 );

Вот код для вычисления групп сглаживания из жестких краев с использованием класса MNMesh:

MNMesh mm = *pMesh; // pMesh contains vert/face data already and is copied to MNMesh
mm.FillInMesh();    // computes helper data in MNMesh
for( int i = 0; i < mm.nume; i++ ) // iterate over all edges
{
    int v1 = mm.E(i)->v1;
    int v2 = mm.E(i)->v2;

    bool found = findHardEdge( v1, v2 );    // check if the edge is a 'hard' one

    if( found )
        mm.E(i)->SetFlag( 32 );     // mark an edge with some flag
}
mm.SmoothByCreases( 32 );       // this method does the job
mm.OutToTri( *pMesh );          // copy data back to the original mesh instance

Я понимаю, что этот код довольно медленный, особенно для больших сеток, но это также самое простое, что я придумал. Если вы знаете лучший способ, дайте мне знать :)

person kolenda    schedule 04.11.2013