FIX:fix bugs of algo and read quad in obj file

Jira: STUDIO-6805
Change-Id: I6c33e8197225f27dccdfa0681e64d76d1df14f61
This commit is contained in:
zhou.xu 2024-04-23 09:14:37 +08:00 committed by Lane.Wei
parent 037f31e12d
commit b6154d4014
4 changed files with 39 additions and 10 deletions

View File

@ -165,12 +165,7 @@ bool load_obj(const char *path, TriangleMesh *meshptr, ObjInfo& obj_info, std::s
} else { } else {
for (size_t k = 0; k < data.usemtls.size(); k++) { for (size_t k = 0; k < data.usemtls.size(); k++) {
auto mtl = data.usemtls[k]; auto mtl = data.usemtls[k];
if (mtl.vertexIdxEnd == -1 && face_index >= (mtl.vertexIdxFirst / ONE_FACE_SIZE)) { if (face_index >= mtl.face_start && face_index <= mtl.face_end) {
set_face_color(face_index, data.usemtls[k].name);
break;
} else if (mtl.vertexIdxEnd != -1 &&
face_index >= (mtl.vertexIdxFirst / ONE_FACE_SIZE)
&& face_index < (mtl.vertexIdxEnd / ONE_FACE_SIZE)) {
set_face_color(face_index, data.usemtls[k].name); set_face_color(face_index, data.usemtls[k].name);
break; break;
} }

View File

@ -251,6 +251,24 @@ static bool obj_parseline(const char *line, ObjData &data)
data.vertices.push_back(vertex); data.vertices.push_back(vertex);
EATWS(); EATWS();
} }
if (data.usemtls.size() > 0) {
data.usemtls.back().vertexIdxEnd = (int) data.vertices.size();
}
if (data.usemtls.size() > 0) {
int face_index_count = 0;
for (int i = data.vertices.size() - 1; i >= 0; i--) {
if (data.vertices[i].coordIdx == -1) {
break;
}
face_index_count++;
}
if (face_index_count == 3) {//tri
data.usemtls.back().face_end++;
} else if (face_index_count == 4) {//quad
data.usemtls.back().face_end++;
data.usemtls.back().face_end++;
}
}
vertex.coordIdx = -1; vertex.coordIdx = -1;
vertex.normalIdx = -1; vertex.normalIdx = -1;
vertex.textureCoordIdx = -1; vertex.textureCoordIdx = -1;
@ -289,6 +307,16 @@ static bool obj_parseline(const char *line, ObjData &data)
usemtl.vertexIdxFirst = (int)data.vertices.size(); usemtl.vertexIdxFirst = (int)data.vertices.size();
usemtl.name = line; usemtl.name = line;
data.usemtls.push_back(usemtl); data.usemtls.push_back(usemtl);
if (data.usemtls.size() == 1) {
data.usemtls.back().face_start = 0;
}
else {//>=2
auto count = data.usemtls.size();
auto& last_usemtl = data.usemtls[count-1];
auto& last_last_usemtl = data.usemtls[count - 2];
last_usemtl.face_start = last_last_usemtl.face_end + 1;
}
data.usemtls.back().face_end = data.usemtls.back().face_start - 1;
break; break;
} }
case 'o': case 'o':

View File

@ -27,6 +27,8 @@ struct ObjUseMtl
{ {
int vertexIdxFirst; int vertexIdxFirst;
int vertexIdxEnd{-1}; int vertexIdxEnd{-1};
int face_start;
int face_end{-1};
std::string name; std::string name;
}; };

View File

@ -57,16 +57,19 @@ public:
convert_color_space(flatten_image8UC3, image8UC3, color_space); convert_color_space(flatten_image8UC3, image8UC3, color_space);
cv::Mat image32FC3(image8UC3.rows, 1, CV_32FC3); cv::Mat image32FC3(image8UC3.rows, 1, CV_32FC3);
for (int i = 0; i < image8UC3.rows; i++) image32FC3.at<cv::Vec3f>(i, 0) = image8UC3.at<cv::Vec3b>(i, 0); for (int i = 0; i < image8UC3.rows; i++)
image32FC3.at<cv::Vec3f>(i, 0) = image8UC3.at<cv::Vec3b>(i, 0);
int best_cluster = 1, cur_score = 0, best_score = 100; int best_cluster = 1;
double cur_score, best_score = 100;
int max_cluster = ori_colors.size(); int max_cluster = ori_colors.size();
num_cluster = fmin(num_cluster, max_cluster); num_cluster = fmin(num_cluster, max_cluster);
if (num_cluster < 1) { if (num_cluster < 1) {
cur_score = kmeans(image32FC3, 1, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS); cur_score = kmeans(image32FC3, 1, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS);
best_score = cur_score; best_score = cur_score;
for (int cur_cluster = 2; cur_cluster < 16; cur_cluster++) { for (int cur_cluster = 2; cur_cluster < 16; cur_cluster++) {
if (cur_cluster > max_cluster) break; if (cur_cluster > max_cluster)
break;
cur_score = kmeans(image32FC3, cur_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cur_score = kmeans(image32FC3, cur_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3,
cv::KMEANS_PP_CENTERS); cv::KMEANS_PP_CENTERS);
best_cluster = cur_score < best_score ? cur_cluster : best_cluster; best_cluster = cur_score < best_score ? cur_cluster : best_cluster;
@ -79,7 +82,8 @@ public:
kmeans(image32FC3, best_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS, kmeans(image32FC3, best_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS,
centers32FC3); centers32FC3);
this->m_centers8UC3 = cv::Mat(best_cluster, 1, CV_8UC3); this->m_centers8UC3 = cv::Mat(best_cluster, 1, CV_8UC3);
for (int i = 0; i < best_cluster; i++) this->m_centers8UC3.at<cv::Vec3b>(i) = centers32FC3.at<cv::Vec3f>(i); for (int i = 0; i < best_cluster; i++)
this->m_centers8UC3.at<cv::Vec3b>(i) = centers32FC3.at<cv::Vec3f>(i);
convert_color_space(this->m_centers8UC3, this->m_centers8UC3, color_space, true); convert_color_space(this->m_centers8UC3, this->m_centers8UC3, color_space, true);