//.h
struct UVEdgeInfo
{
int v1;
int v2;
int f;
};
typedef QList<UVEdgeInfo> UVEdgeInfos;
private:
QList<QList<int>> result_uv_border;
QList<int> uv_border;
QList<QList<int>> point_lists;
QList<MNMesh> meshes;
MNMap* map;
int channel;
//.cpp
void CoreUVThread::UVBorder()
{
result_uv_border.clear();
for (int m = 0; m < meshes.count(); m++) {
QList<int> points;
UVEdgeInfo open_edge;
UVEdgeInfos used_edge_list;
int mv1, mv2;
map = meshes[m].M(channel);
uv_border.clear();
point_lists.clear();
if (map)
{
for (int i = 0; i < map->numf; i++)
{
points.clear();
for (int d = 0; d < map->f[i].deg; d++)
points.push_back(map->f[i].tv[d]);
point_lists.push_back(points);
}
for (int i = 0; i < map->numf; i++)
{
points = point_lists[i];
open_edge.f = i;
for (int v = 0; v < points.count(); v++)
{
open_edge.v1 = points[v];
if (v == points.count() - 1)
open_edge.v2 = points[0];
else
open_edge.v2 = points[v + 1];
if (IsBorder(map, open_edge))
{
mv1 = meshes[m].f[i].vtx[v];
if (v == points.count() - 1)
mv2 = meshes[m].f[i].vtx[0];
else
mv2 = meshes[m].f[i].vtx[v + 1];
for (int d = 0; d < meshes[m].f[i].deg; d++)
{
if ((meshes[m].e[meshes[m].f[i].edg[d]].v1 == mv1 && meshes[m].e[meshes[m].f[i].edg[d]].v2 == mv2) ||
(meshes[m].e[meshes[m].f[i].edg[d]].v2 == mv1 && meshes[m].e[meshes[m].f[i].edg[d]].v1 == mv2))
{
uv_border.push_back(meshes[m].f[i].edg[d]);
break;
}
}
}
used_edge_list.push_back(open_edge);
}
}
}
result_uv_border.append(uv_border);
}
emit SendUVBorder();
}
bool CoreUVThread::IsBorder(MNMap* map, UVEdgeInfo edge)
{
for (int i = 0; i < map->numf; i++)
{
if (i == edge.f)
continue;
if (point_lists[i].contains(edge.v1) && point_lists[i].contains(edge.v2))
return false;
}
return true;
}
在max中计算uv边界边
最新推荐文章于 2024-09-30 14:20:59 发布