FIX: fix the bugs related to bottom area and flip
[STUDIO-1079] Large plane not stick to bed [STUDIO-1437] Model auto flipping bug 1. Changed the orientation threshold so that some tiny rotations wont be ignored. 2. Added flipping detection. Rotation with same unprintability will not be excuted. 3. Added the weight of first layer area to improve large planar face orientatio performance while not influence other objects with small first layer areas. Change-Id: I1efc9252c90bc053e65cb71e7770cb8d0305cb6e (cherry picked from commit 1eda67e4fd0cd2536af219e0c225fc08949b5023)
This commit is contained in:
parent
f6ff0f6131
commit
2b3e533b8b
|
@ -111,7 +111,7 @@ public:
|
||||||
{
|
{
|
||||||
orientations = { { 0,0,-1 } }; // original orientation
|
orientations = { { 0,0,-1 } }; // original orientation
|
||||||
|
|
||||||
area_cumulation(normals, areas);
|
area_cumulation(normals, areas, 10);
|
||||||
|
|
||||||
area_cumulation(normals_hull, areas_hull, 10);
|
area_cumulation(normals_hull, areas_hull, 10);
|
||||||
|
|
||||||
|
@ -152,8 +152,23 @@ public:
|
||||||
if (progressind)
|
if (progressind)
|
||||||
progressind(80);
|
progressind(80);
|
||||||
|
|
||||||
|
//To avoid flipping, we need to verify if there are orientations with same unprintability.
|
||||||
|
Vec3f n1 = {0, 0, 1};
|
||||||
auto best_orientation = results_vector[0].first;
|
auto best_orientation = results_vector[0].first;
|
||||||
|
|
||||||
|
for (int i = 1; i< results_vector.size()-1; i++) {
|
||||||
|
if (abs(results_vector[i].second.unprintability - results_vector[0].second.unprintability) < EPSILON && abs(results_vector[0].first.dot(n1)-1) > EPSILON) {
|
||||||
|
if (abs(results_vector[i].first.dot(n1)-1) < EPSILON) {
|
||||||
|
best_orientation = n1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(info) << std::fixed << std::setprecision(6) << "best:" << best_orientation.transpose() << ", costs:" << results_vector[0].second.field_values();
|
BOOST_LOG_TRIVIAL(info) << std::fixed << std::setprecision(6) << "best:" << best_orientation.transpose() << ", costs:" << results_vector[0].second.field_values();
|
||||||
std::cout << std::fixed << std::setprecision(6) << "best:" << best_orientation.transpose() << ", costs:" << results_vector[0].second.field_values() << std::endl;
|
std::cout << std::fixed << std::setprecision(6) << "best:" << best_orientation.transpose() << ", costs:" << results_vector[0].second.field_values() << std::endl;
|
||||||
|
|
||||||
|
@ -227,6 +242,7 @@ public:
|
||||||
for (size_t i = 0; i < num_directions; i++)
|
for (size_t i = 0; i < num_directions; i++)
|
||||||
{
|
{
|
||||||
orientations.push_back(align_counts[i].first);
|
orientations.push_back(align_counts[i].first);
|
||||||
|
//orientations.push_back(its_face_normals(mesh->its)[i]);
|
||||||
BOOST_LOG_TRIVIAL(debug) << align_counts[i].first.transpose() << ", area: " << align_counts[i].second;
|
BOOST_LOG_TRIVIAL(debug) << align_counts[i].first.transpose() << ", area: " << align_counts[i].second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -246,7 +262,7 @@ public:
|
||||||
/// remove duplicate orientations
|
/// remove duplicate orientations
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="tol">tolerance. default 0.01 =sin(0.57\degree)</param>
|
/// <param name="tol">tolerance. default 0.01 =sin(0.57\degree)</param>
|
||||||
void remove_duplicates(float tol=0.001)
|
void remove_duplicates(double tol=0.00000001)
|
||||||
{
|
{
|
||||||
for (auto it = orientations.begin()+1; it < orientations.end(); )
|
for (auto it = orientations.begin()+1; it < orientations.end(); )
|
||||||
{
|
{
|
||||||
|
@ -332,8 +348,14 @@ public:
|
||||||
|
|
||||||
float total_min_z = z_projected.minCoeff();
|
float total_min_z = z_projected.minCoeff();
|
||||||
// filter bottom area
|
// filter bottom area
|
||||||
auto bottom_condition = z_max.array() < total_min_z + this->params.FIRST_LAY_H;
|
auto bottom_condition = z_max.array() < total_min_z + this->params.FIRST_LAY_H - EPSILON;
|
||||||
costs.bottom = bottom_condition.select(areas, 0).sum();
|
auto bottom_condition_hull = z_max_hull.array() < total_min_z + this->params.FIRST_LAY_H - EPSILON;
|
||||||
|
auto bottom_condition_2nd = z_max.array() < total_min_z + this->params.FIRST_LAY_H/2.f - EPSILON;
|
||||||
|
//The first layer is sliced on half of the first layer height.
|
||||||
|
//The bottom area is measured by accumulating first layer area with the facets area below first layer height.
|
||||||
|
//By combining these two factors, we can avoid the wrong orientation of large planar faces while not influence the
|
||||||
|
//orientations of complex objects with small bottom areas.
|
||||||
|
costs.bottom = bottom_condition.select(areas, 0).sum()*0.5 + bottom_condition_2nd.select(areas, 0).sum();
|
||||||
|
|
||||||
// filter overhang
|
// filter overhang
|
||||||
Eigen::VectorXf normal_projection(normals.rows(), 1);// = this->normals.dot(orientation);
|
Eigen::VectorXf normal_projection(normals.rows(), 1);// = this->normals.dot(orientation);
|
||||||
|
@ -378,7 +400,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// bottom of convex hull
|
// bottom of convex hull
|
||||||
costs.bottom_hull = (z_max_hull.array()< total_min_z + this->params.FIRST_LAY_H).select(areas_hull, 0).sum();
|
costs.bottom_hull = (bottom_condition_hull).select(areas_hull, 0).sum();
|
||||||
|
|
||||||
// low angle faces
|
// low angle faces
|
||||||
auto normal_projection_abs = normal_projection.cwiseAbs();
|
auto normal_projection_abs = normal_projection.cwiseAbs();
|
||||||
|
@ -400,7 +422,7 @@ public:
|
||||||
if (min_volume)
|
if (min_volume)
|
||||||
{
|
{
|
||||||
float overhang = costs.overhang / 25;
|
float overhang = costs.overhang / 25;
|
||||||
cost = params.TAR_A * (overhang + params.TAR_B) + params.RELATIVE_F * (/*costs.volume/100*/overhang*params.TAR_C + params.TAR_D + params.TAR_LAF * costs.area_laf * params.use_low_angle_face) / (params.TAR_D + params.CONTOUR_F * costs.contour + params.BOTTOM_F * bottom + params.BOTTOM_HULL_F * bottom_hull + params.TAR_E * overhang + params.TAR_PROJ_AREA * costs.area_projected);
|
cost = params.TAR_A * (overhang + params.TAR_B) + params.RELATIVE_F * (/*costs.volume/100*/overhang*params.TAR_C + params.TAR_D/10.f + params.TAR_LAF * costs.area_laf * params.use_low_angle_face) / (params.TAR_D + params.CONTOUR_F * costs.contour + params.BOTTOM_F * bottom + params.BOTTOM_HULL_F * bottom_hull + params.TAR_E * overhang + params.TAR_PROJ_AREA * costs.area_projected);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
float overhang = costs.overhang;
|
float overhang = costs.overhang;
|
||||||
|
|
|
@ -53,7 +53,7 @@ struct OrientParamsArea {
|
||||||
float TAR_E = 0.0115f;
|
float TAR_E = 0.0115f;
|
||||||
float FIRST_LAY_H = 0.2f;//0.0475;
|
float FIRST_LAY_H = 0.2f;//0.0475;
|
||||||
float VECTOR_TOL = -0.00083f;
|
float VECTOR_TOL = -0.00083f;
|
||||||
float NEGL_FACE_SIZE = 0.1f;
|
float NEGL_FACE_SIZE = 0.01f;
|
||||||
float ASCENT = -0.5f;
|
float ASCENT = -0.5f;
|
||||||
float PLAFOND_ADV = 0.0599f;
|
float PLAFOND_ADV = 0.0599f;
|
||||||
float CONTOUR_AMOUNT = 0.0182427f;
|
float CONTOUR_AMOUNT = 0.0182427f;
|
||||||
|
|
Loading…
Reference in New Issue