两轮填数据方式
This commit is contained in:
1 parent
b469eb83ff
commit
ec1a89b078
1 file changed
+43
-33
+43
-33
@@ -5715,7 +5715,7 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
|
|||||||
|
|
||||||
// 如果夹角小于45度(cos(45°) ≈ 0.7071),则计入覆盖
|
// 如果夹角小于45度(cos(45°) ≈ 0.7071),则计入覆盖
|
||||||
float fAngleThreshold1 = 0.6071; // 0.7071f
|
float fAngleThreshold1 = 0.6071; // 0.7071f
|
||||||
float fAngleThreshold2 = 0.7071; // 0.7071f
|
float fAngleThreshold2 = 0.8571; // 0.7071f
|
||||||
|
|
||||||
// 初始化数据结构
|
// 初始化数据结构
|
||||||
std::vector<bool> processedFaces(faces.size(), false);
|
std::vector<bool> processedFaces(faces.size(), false);
|
||||||
@@ -5723,7 +5723,7 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
|
|||||||
|
|
||||||
DEBUG_EXTRA("开始新的虚拟面片创建逻辑: 基于视图排序");
|
DEBUG_EXTRA("开始新的虚拟面片创建逻辑: 基于视图排序");
|
||||||
|
|
||||||
/*
|
//*
|
||||||
// 1. 计算每个视图的覆盖情况
|
// 1. 计算每个视图的覆盖情况
|
||||||
Util::Progress progress1(_T("计算视图覆盖"), images.size());
|
Util::Progress progress1(_T("计算视图覆盖"), images.size());
|
||||||
for (IIndex idxView = 0; idxView < images.size(); ++idxView) {
|
for (IIndex idxView = 0; idxView < images.size(); ++idxView) {
|
||||||
@@ -5835,8 +5835,8 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
|
|||||||
|
|
||||||
DEBUG_EXTRA("排序后视图数量: %zu,最大覆盖: %d, 共%d", viewCoverage.size(),
|
DEBUG_EXTRA("排序后视图数量: %zu,最大覆盖: %d, 共%d", viewCoverage.size(),
|
||||||
viewCoverage.empty() ? 0 : viewCoverage[0].second, totalCoverage);
|
viewCoverage.empty() ? 0 : viewCoverage[0].second, totalCoverage);
|
||||||
|
//*/
|
||||||
|
|
||||||
*/
|
|
||||||
float thMaxColorDeviation = 130.0f;
|
float thMaxColorDeviation = 130.0f;
|
||||||
|
|
||||||
const float ratioAngleToQuality(0.67f);
|
const float ratioAngleToQuality(0.67f);
|
||||||
@@ -6003,14 +6003,14 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
|
|||||||
|
|
||||||
if (scene.is_face_edge(strName, virtualFaceCenterFaceID))
|
if (scene.is_face_edge(strName, virtualFaceCenterFaceID))
|
||||||
{
|
{
|
||||||
// if (angleDeg <= 20.0f)
|
if (angleDeg <= 30.0f)
|
||||||
{
|
{
|
||||||
mapSortedcams2[idxView] = angleDeg;
|
mapSortedcams2[idxView] = angleDeg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// if (angleDeg <= 40.0f)
|
if (angleDeg <= 60.0f)
|
||||||
{
|
{
|
||||||
mapSortedcams2[idxView] = angleDeg;
|
mapSortedcams2[idxView] = angleDeg;
|
||||||
}
|
}
|
||||||
@@ -6047,34 +6047,11 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
|
|||||||
IIndexArr filteredCams;
|
IIndexArr filteredCams;
|
||||||
|
|
||||||
int nViewCoverage = 0;
|
int nViewCoverage = 0;
|
||||||
int nViewCoverageMax = 20;
|
int nViewCoverageMax = 200;
|
||||||
int nHit = 0;
|
int nHit = 0;
|
||||||
int nHitMax = 10;
|
int nHitMax = 1;
|
||||||
for (size_t i = 0; i < sortedCams2.size(); ++i)
|
std::map<IIndex, IIndex> mapProcessedViewIdx;
|
||||||
{
|
//*
|
||||||
if (nViewCoverage>=nViewCoverageMax)
|
|
||||||
// if (nHit>nHitMax)
|
|
||||||
break;
|
|
||||||
IIndex viewIdx = sortedCams2[i].first;
|
|
||||||
float val = sortedCams2[i].second;
|
|
||||||
|
|
||||||
const Image& imageData = images[viewIdx];
|
|
||||||
std::string strPath = imageData.name;
|
|
||||||
std::string strName = MeshTexture::GetFileNameWithoutExtension(strPath);
|
|
||||||
|
|
||||||
// if (!scene.is_face_delete_edge2(strName, virtualFaceCenterFaceID))
|
|
||||||
{
|
|
||||||
filteredCams.push_back(viewIdx);
|
|
||||||
++nHit;
|
|
||||||
|
|
||||||
if (nHit>=nHitMax)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
++nViewCoverage;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
for (const auto& [viewIdx, coverageCount] : viewCoverage) {
|
for (const auto& [viewIdx, coverageCount] : viewCoverage) {
|
||||||
if (nViewCoverage>=nViewCoverageMax)
|
if (nViewCoverage>=nViewCoverageMax)
|
||||||
// if (nHit>nHitMax)
|
// if (nHit>nHitMax)
|
||||||
@@ -6116,6 +6093,7 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
|
|||||||
if (!scene.is_face_delete_edge2(strName, virtualFaceCenterFaceID))
|
if (!scene.is_face_delete_edge2(strName, virtualFaceCenterFaceID))
|
||||||
{
|
{
|
||||||
filteredCams.push_back(viewIdx);
|
filteredCams.push_back(viewIdx);
|
||||||
|
mapProcessedViewIdx[viewIdx] = viewIdx;
|
||||||
++nHit;
|
++nHit;
|
||||||
|
|
||||||
if (nHit>=nHitMax)
|
if (nHit>=nHitMax)
|
||||||
@@ -6125,7 +6103,39 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
|
|||||||
|
|
||||||
++nViewCoverage;
|
++nViewCoverage;
|
||||||
}
|
}
|
||||||
*/
|
//*/
|
||||||
|
|
||||||
|
nViewCoverage = 0;
|
||||||
|
nViewCoverageMax = 200;
|
||||||
|
nHit = 0;
|
||||||
|
nHitMax = 5;
|
||||||
|
for (size_t i = 0; i < sortedCams2.size(); ++i)
|
||||||
|
{
|
||||||
|
if (nViewCoverage>=nViewCoverageMax)
|
||||||
|
// if (nHit>nHitMax)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IIndex viewIdx = sortedCams2[i].first;
|
||||||
|
float val = sortedCams2[i].second;
|
||||||
|
|
||||||
|
if (mapProcessedViewIdx.count(viewIdx) > 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const Image& imageData = images[viewIdx];
|
||||||
|
std::string strPath = imageData.name;
|
||||||
|
std::string strName = MeshTexture::GetFileNameWithoutExtension(strPath);
|
||||||
|
|
||||||
|
// if (!scene.is_face_delete_edge2(strName, virtualFaceCenterFaceID))
|
||||||
|
{
|
||||||
|
filteredCams.push_back(viewIdx);
|
||||||
|
++nHit;
|
||||||
|
|
||||||
|
if (nHit>=nHitMax)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
++nViewCoverage;
|
||||||
|
}
|
||||||
|
|
||||||
if (filteredCams.empty()) {
|
if (filteredCams.empty()) {
|
||||||
size_t count = std::min(sortedCams.size(), static_cast<size_t>(3));
|
size_t count = std::min(sortedCams.size(), static_cast<size_t>(3));
|
||||||
|
|||||||
Reference in new issue
Block a user