diff --git a/libs/MVS/SceneTexture.cpp b/libs/MVS/SceneTexture.cpp index 17c88fb..fd47141 100644 --- a/libs/MVS/SceneTexture.cpp +++ b/libs/MVS/SceneTexture.cpp @@ -17905,7 +17905,7 @@ bool MeshTexture::SelectBestViewsForVirtualFaces( DEBUG_EXTRA("Selecting best views for %zu virtual faces", virtualFaceMap.size()); - // ---------- 准备禁用视图列表(禁用最后一个单独数字 = 最大值的【所有】相机) ---------- + // ---------- 准备禁用视图列表(禁用最后单个数字最大的【两个数值】的所有相机) ---------- std::unordered_set disabledViews; { struct ViewDigitPair { @@ -17913,11 +17913,11 @@ bool MeshTexture::SelectBestViewsForVirtualFaces( int digit; }; std::vector viewDigits; - + for (IIndex idx = 0; idx < (IIndex)images.size(); ++idx) { const Image& img = images[idx]; if (!img.IsValid()) continue; - + // 提取文件名(不含路径和扩展名) std::string path = img.name; size_t lastSlash = path.find_last_of("/\\"); @@ -17925,7 +17925,7 @@ bool MeshTexture::SelectBestViewsForVirtualFaces( size_t lastDot = path.find_last_of('.'); if (lastDot == std::string::npos) lastDot = path.size(); std::string strName = path.substr(start, lastDot - start); - + // 提取最后一个 _ 前面的最后一个数字字符 int digit = -1; size_t lastUnderscore = strName.find_last_of('_'); @@ -17938,28 +17938,43 @@ bool MeshTexture::SelectBestViewsForVirtualFaces( if (pos == 0) break; } } - + if (digit >= 0) { viewDigits.push_back({idx, digit}); } } - - // ★ 找到最大的 digit 值 - int maxDigit = -1; + + // ★ 找出最大的两个【不同】digit值 + std::set uniqueDigits; for (const auto& vd : viewDigits) { - if (vd.digit > maxDigit) maxDigit = vd.digit; + uniqueDigits.insert(vd.digit); } - - // ★ 禁用【所有】digit == maxDigit 的视图(不再只禁前 N 个) + + std::vector topDigits; + auto it = uniqueDigits.rbegin(); + // 取最大的第一个 + if (it != uniqueDigits.rend()) { + topDigits.push_back(*it); + ++it; + } + // 取最大的第二个(次大) + if (it != uniqueDigits.rend()) { + topDigits.push_back(*it); + ++it; + } + + // ★ 禁用所有 digit 等于这两个最大值的视图 for (const auto& vd : viewDigits) { - if (vd.digit == maxDigit) { + if (std::find(topDigits.begin(), topDigits.end(), vd.digit) != topDigits.end()) { disabledViews.insert(vd.idx); - DEBUG_EXTRA("[DisabledView] idx=%d name=%s digit=%d (maxDigit=%d)", - vd.idx, images[vd.idx].name.c_str(), vd.digit, maxDigit); + DEBUG_EXTRA("[DisabledView] idx=%d name=%s digit=%d (topDigits=[%d,%d])", + vd.idx, images[vd.idx].name.c_str(), vd.digit, + topDigits[0], topDigits.size() > 1 ? topDigits[1] : -1); } } - DEBUG_EXTRA("[DisabledView] %zu views disabled (all with digit=%d)", - disabledViews.size(), maxDigit); + DEBUG_EXTRA("[DisabledView] %zu views disabled (all with digit in [%d,%d])", + disabledViews.size(), + topDigits[0], topDigits.size() > 1 ? topDigits[1] : -1); } // ---------- 初始化 ----------