Использование assimp для загрузки сеток и обнаружения в них граничных и неоднородных ребер

Я пытаюсь использовать assimp для загрузки сеток, чтобы обнаруживать не-манифольдные и открытые (граничные) края. Я использую индексы вершин, которые я получаю из ассиметрии, чтобы установить отношения между вершинами, ребрами и гранями. у меня есть класс лица, который выглядит так

#include "Face2.h"

Face2::Face2()
{
}

Face2::Face2(std::vector<unsigned int> indices)
{
    m_indices = indices;
}

bool Face2::containsEdge(const Edge2 &edge)
{
//    for(unsigned int i = 0; i < m_indices.size(); i++)
//    {
//        if(edge.getStartIndex() == m_indices[i]){
//            for(unsigned int i = 0; i < m_indices.size(); i++)
//            {
//                edge.getEndIndex() == m_indices[i]
//            }

//        }
//    }
    for(unsigned int i = 0; i < m_indices.size(); i++)
    {
        if(edge.getStartIndex() == m_indices[i])
        {
            for(unsigned int j = 0; j < m_indices.size(); j++)
            {
                if(edge.getEndIndex() == m_indices[j]) return true;
            }
        }
    }
    return false;
}

std::vector<unsigned int> Face2::getIndices() const
{
    return m_indices;
}

void Face2::setIndices(const std::vector<unsigned int> &indices)
{
    m_indices = indices;
}

мой класс края - это в основном просто структура данных, которая содержит начальный и конечный индекс края. Мой класс сетки содержит std :: vector граней и std :: vector ребер, которые заполняются следующим образом:

for(unsigned int i = 0; i < m_indices.size()-1; i+=2)
    {
        m_edges2.push_back(Edge2(m_indices[i], m_indices[i]));
    }

    for(unsigned int i = 0; i < m_indices.size()-1; i+=3)
    {
        std::vector<unsigned int> faceData;
        faceData.push_back(m_indices[i]);
        faceData.push_back(m_indices[i+1]);
        faceData.push_back(m_indices[i+2]);
        m_faces2.push_back(Face2(faceData));
   }

моя основная функция имеет этот код:

    std::cout << "Number of edges2: " << m->getEdges2().size() << std::endl;
    std::cout << "Number of faces2: " << m->getFaces2().size() << std::endl;
    std::cout << "finished " << std::endl;

    unsigned int nonManif = 0;
    unsigned int boundary = 0;

    for(unsigned int i = 0; i < m->getEdges2().size(); i++)
    {
        unsigned int edgeCount = 0;
        for(unsigned int j = 0; j < m->getFaces2().size(); j++)
        {
            if(m->getFaces2().at(j).containsEdge(m->getEdges2().at(i)))
            {
                edgeCount++;
            }
        }

        std::cout << "Edge#" << i << " occurences: " << edgeCount << std::endl;
        if(edgeCount > 2) nonManif++;
        else if(edgeCount < 2) boundary++;
    }

    std::cout << "Non-Manifold: " << nonManif << std::endl;
    std::cout << "Boundary: " << boundary << std::endl;

Я получаю из этого нужное количество граней и граней. Однако количество граничных ребер сильно отличается от того, что я получаю от meshlab для той же модели. а количество не многообразных ребер всегда равно 0.

Я делаю их что-то не так, или их способ лучше?


person Abdullah Al-Hatem    schedule 09.02.2016    source источник


Ответы (1)


Думаю, здесь ошибка:

m_edges2.push_back(Edge2(m_indices[i], m_indices[i]));

Полагаю, должно быть:

m_edges2.push_back(Edge2(m_indices[i], m_indices[i + 1]));

Исправление может решить вашу проблему

Также есть еще одна ошибка в цикле создания граней с верхней границей итерации, которая может вызвать UB. Должен быть:

i < m_indices.size()-2
person Sergey Krivohatskiy    schedule 11.02.2016
comment
К сожалению, это не помогло, но это, безусловно, шаг в правильном направлении. Однако, поскольку все загружаемые сетки триангулированы, не следует ли мне также добавлять ребро через каждые три индекса между первым и последним индексами? Думаю, я попробую и посмотрю, какие результаты я получу - person Abdullah Al-Hatem; 12.02.2016