Предположат, у нас есть 3D-сетку с текстурными координатами для каждой вершины, так что если я сделать это разворачивало я получаю что-то вроде этого (игнорировать красный квадрат):Идентифицировать развернутые сетки УФ области
Теперь я 'm пытается найти правильный алгоритм, чтобы однозначно идентифицировать те области, используя вершинные UVs и сохраняя атрибут с этим уникальным значением id. Идея заключается в том, чтобы использовать это значение в качестве индекса для таблицы цветов и получить что-то вроде этого (ручная работы):
Я попытался перебору каждой вершины и найти «несвязанные» треугольники сравнивающих текстур COORDS, но порядок индексов сетки кажется не связанным с тем, как размещены УФ-объекты, или я не применяю правильную формулу. Я не сомневаюсь, как хранить и передавать это значение в шейдер или что-то еще, сомнение в том, как знать «регион», к которому принадлежит вершина, или, в конечном счете, пиксель.
Спасибо.
ОБНОВЛЕНИЕ: Данные, используемые для отображения сетки, представляют собой список вершин (GL_VERTEX_BUFFER) и список индексов (GL_ELEMENT_ARRAY). Сетка отображается как GL_TRIANGLES, а каждая вершина является структурой, как это:
struct Vertex
{
float x, y, z;
float nx, ny, nz;
float tcx, tcy;
float regionId; //the attribute I want to fill
};
struct MPUVRegionVertex
{
float x, y;
int faceId, regionId;
};
UPDATE 2: Я создал новую вершину массив MPUVRegionVertex, с элементом для каждого индекса (не в единственной вершиной). После ответа @ CsabaBálint я закончил с этим кодом:
MPUVRegionVertex* uvVertexData = new MPUVRegionVertex[indexCount];
for(int ic = 0; ic < indexCount/3; ic++)
{
for(int vc = 0; vc < 3; vc++)
{
uvVertexData[3*ic+vc].x = vertexData[indexData[3*ic+vc]].tcx;
uvVertexData[3*ic+vc].y = vertexData[indexData[3*ic+vc]].tcy;
uvVertexData[3*ic+vc].faceId = ic;
}
}
std::vector<std::forward_list<int> > graph(indexCount);
for(int t1=0;t1 < indexCount; ++t1)
{
for(int t2 = t1 + 1; t2 < indexCount; ++t2)
{
if (uvVertexData[t1].faceId == uvVertexData[t2].faceId)
{
graph[t1].push_front(t2);
graph[t2].push_front(t1);
}
}
}
std::forward_list<int> stack;
std::vector<int> component(indexCount);
std::set<int> notvisited;
for(int nv = 0; nv < indexCount; nv++)
{
notvisited.insert(nv);
}
int k = 0;
while(notvisited.size() > 0)
{
stack.push_front(*notvisited.begin());
notvisited.erase(notvisited.begin());
while(!stack.empty())
{
//SOMETHING WRONG HERE
int temp = stack.front();
notvisited.erase(temp);
stack.pop_front();
component[temp] = k;
stack.merge(graph[temp]);
graph[temp].clear();
}
k++;
}
Результатом является другими к каждому три индекса, это означает, что к ++ вызываются для каждого нового треугольника, так что я что-то в алгоритме отсутствует: S ,
component[0]=0
component[1]=0
component[2]=0
component[3]=1
component[4]=1
component[5]=1
component[6]=2
component[7]=2
component[8]=2
component[9]=3
...
component[1778]=592
component[1779]=593
component[1780]=593
component[1781]=593
Некоторая информация о сетке:
Size of shape[0].indices: 1782
shape[0].positions: 1242
shape[0].texcoords: 828
shape[0].normals: 1242
UPDATE 3
Для получения дополнительной информации, есть только один УФ коорд для каждой вершины.
Отчисления/Правила до сих пор:
- вершина может быть в большей, чем одно лицо (часть из более чем одного треугольника).
- вершина будет n раз в массиве vertexToFace, как только на лицо оно принадлежит.
- первая вершина в массиве vertexToFace будет произвольной иметь regionId = 0.
- вершина относится к области, если она разделяет одни и те же координаты x и y или одну и ту же грань другой вершины в этом регионе.
Если я правильно понял, это правильная информация для реализации нерекурсивного обхода графика.Мне нужно повторить и сохранить как подключенную, так и несвязанную вершину, все связанные вершины будут частью текущей области, все не будут проверены снова с уже подключенными, первая итерация хранит первые треугольные вершины, вторая - все вершины треугольники, которые «касаются» первого треугольника, продолжаются до тех пор, пока итерация не даст никакой новой связанной вершины (оптимизация здесь, если мы проверяем только список вершин, добавленных в последнюю итерацию), никакая добавленная новая вершина означает, что пришло время увеличить областьId и снова начните с первой несвязанной вершины.
Я попытаюсь реализовать поиск по этому проекту.
Это не поможет ему найти значение пикселя данного лица. –
@cmbasnett Вы отвлекаетесь на «Я не сомневаюсь, как хранить и передавать это значение в шейдер или что-то в этом роде, сомнение в том, как узнать« область », к которой принадлежит вершина, или, в конечном счете, пиксель.«И в моем ответе для данного идентификатора вершин есть идентификатор компонента, который он уже знает, как перейти к шейдеру. –
это похоже на то, что мне нужно, но как можно получить первое значение« face »« ВершинаToFace [ i] == j означает, что i-я вершина находится на грани j. «Ультрафиолетовый компас, чтобы получить лицо, - это то, что я делаю неправильно в своей первой попытке, я думаю. – Gallo