void set_display_params() { float ang_span_Thresh, tmp_scale; if (isMonocular) { m.delta_pos = new Vector3(513.0f, 0, 0.0f); m.pos = new Vector3(0.0f, 0, 1000.0f); modified_obj.translate = m.pos; m.fct = 0.75f; line_width = 6.30f; wire_frm_dst = 5.50f; ang_span_Thresh = 28; tmp_scale = 1e-5f; } else { m.delta_pos = new Vector3(0.60f, 0.0f, 0.0f); m.pos = new Vector3(0.00f, 0, 1.0f); modified_obj.translate = m.pos; m.fct = 0.75f; line_width = 0.006240f; wire_frm_dst = 3.80f; ang_span_Thresh = 28; tmp_scale = 1e-10f; } //Set scale according to angular span on screen obj = new OffObject(); obj.copy_properties_from(modified_obj); Matrix4x4 tmp1 = Matrix4x4.TRS(Vector3.zero, modified_obj.rotation, Vector3.one); obj.rotate_object(tmp1); // obj.scale_object(tmp_scale); obj.translate_object(modified_obj.translate); while (obj.max_angular_span() < ang_span_Thresh) { //restore to original scale obj.translate_object(-obj.centre); obj.scale_object((1.0f / tmp_scale)); //Rescale to new scale and translate tmp_scale *= 1.01f; obj.scale_object(tmp_scale); obj.translate_object(modified_obj.translate); } //if (modified_obj.compactess() < 0.14) // tmp_scale *= 1.3f; m.scale = tmp_scale; modified_obj.scale = tmp_scale; }
bool modify_symmetry(float tSL, float tSH, Matrix4x4 mat) { bool ret = true; //Now keep stretching until the derired assymetry is reached. int cntrLmt = 100, cntr = 0; while ((modified_obj.degree_of_asymmetry() < tSL || modified_obj.degree_of_asymmetry() > tSH) && cntr < cntrLmt) { modified_obj.rotate_object(mat); cntr++; } if (cntr >= cntrLmt) { ret = false; } return(ret); }
bool is_view_acceptable() { obj = new OffObject(); obj.copy_properties_from(modified_obj); //Rotate obj.rotate_object(m.rv_rot_mat); //scale obj.scale_object((float)m.scale); //translate //m.pos.z *= -1; obj.translate_object(m.pos); //Unity is left-handed for (int k = 0; k < 16; k++) { obj.verts[k].z *= -1; } obj.recalc_centre_norms_and_face_norms(); // int[] baze = { 0, 1, 2, 3, 8, 9, 10, 11 }; int[] non_baze = { 4, 5, 6, 7, 12, 13, 14, 15 }; //Among the non-baze, how many are vsible? int vis_num = 0; int tmpCntr; for (int i = 0; i < 8; i++) { tmpCntr = 0; Vector3 cv = obj.verts[non_baze[i]]; for (int j = 0; j < obj.faces.Length; j++) { //if the trg contains this vertex if (obj.faces[j].x == non_baze[i] || obj.faces[j].y == non_baze[i] || obj.faces[j].z == non_baze[i]) { tmpCntr++; continue; } Vector3[] trg = { obj.verts[(int)obj.faces[j].x], obj.verts[(int)obj.faces[j].y], obj.verts[(int)obj.faces[j].z] }; if (Helper.is_vertex_occluded(trg, cv)) { break; } tmpCntr++; } // if none of the faces block it if (tmpCntr++ >= obj.faces.Length) { vis_num++; } } //Debug.Log("vis_num:" + vis_num.ToString()); //if atleast 5 of them are not visible, return failed if (vis_num < 6) { //if (cntr == (attLmt - 1)) //{ // Debug.Log("Non-base vertex count fail"); //} return(false); } //Now we need to check if a total of 10 vertices are visible for (int i = 0; i < 8; i++) { Vector3 cv = obj.verts[baze[i]]; tmpCntr = 0; for (int j = 0; j < obj.faces.Length; j++) { //if the trg contains this vertex if (obj.faces[j].x == baze[i] || obj.faces[j].y == baze[i] || obj.faces[j].z == baze[i]) { tmpCntr++; continue; } Vector3[] trg = { obj.verts[(int)obj.faces[j].x], obj.verts[(int)obj.faces[j].y], obj.verts[(int)obj.faces[j].z] }; if (Helper.is_vertex_occluded(trg, cv)) { break; } tmpCntr++; } if (tmpCntr >= obj.faces.Length) { vis_num++; } if (vis_num >= 11) { return(true); } } //if (cntr == (attLmt - 1)) //{ // Debug.Log("All vertex count fail"); //} return(false); }