using System.Collections; using System.Collections.Generic; using UnityEngine; using VRTK; //Set to Template option public class Voronoi_Joint : MonoBehaviour { public enum GEOMETRY { TETRA, OCTA, }; public GEOMETRY geo = GEOMETRY.TETRA; public GameObject[] centerRbs = new GameObject[6];//4 public GameObject[] connected_Joints = new GameObject[6];//4 private Vector3[] cj_12_EndPoints = new Vector3[12]; private Vector3[] cj_24_EndPoints = new Vector3[24]; private Vector3 startPosition; //private int[,] vN_Points_to; private Six_Splines six_splines; private Twelve_Splines twelve_Splines; public bool bPrint_Debug = false; public Button_VU bvToggle_Hi_Res; /// <image url="$(SolutionDir)\EMB\EMB_Edge_Vert.png" scale="0.36" /> /// <image url="$(SolutionDir)\EMB\EMB_Edge_Vert_2.png" scale="0.1" /> public float radius = 1; public float outerforceMag = 10; public float centering_Mult = 1; public float torque_Coefficient = 1f; private VRTK_InteractableObject vrtk_Interact_1; public enum Handle_States { NORMAL, TOUCHED, GRABBED, } private Handle_States handle_State = Handle_States.NORMAL; public Color handle_Base_Col; public Color handle_Touched_Col; public Color handle_Grabbed_Col; private Color handle_Base_Emissive_Col; private VU_UI_MANAGER VU_UI; public bool bUsePhysics = true; public bool bSetTetraPositions = false; public GameObject TetraVoronoi; void Start() { startPosition = transform.position; bvToggle_Hi_Res.isON = false; vrtk_Interact_1 = GetComponent<VRTK_InteractableObject>(); VU_UI = VU_UI_MANAGER.Instance; if (geo == GEOMETRY.TETRA) { six_splines = GetComponentInChildren<Six_Splines>(); six_splines.Set_CJ_0_GO(connected_Joints[0]);//For OutII } else if(geo == GEOMETRY.OCTA) { twelve_Splines = GetComponentInChildren<Twelve_Splines>(); } vrtk_Interact_1.InteractableObjectTouched += new InteractableObjectEventHandler(DoObject_1_Touched); vrtk_Interact_1.InteractableObjectUntouched += new InteractableObjectEventHandler(DoObject_1_Untouched); vrtk_Interact_1.InteractableObjectGrabbed += new InteractableObjectEventHandler(DoObject_1_Grabbed); vrtk_Interact_1.InteractableObjectUngrabbed += new InteractableObjectEventHandler(DoObject_1_Ungrabbed); if (!bUsePhysics) { Rigidbody[] rbs = GetComponentsInChildren<Rigidbody>(); foreach(Rigidbody rb in rbs) { rb.isKinematic = true; } for (int i = 0; i < centerRbs.Length; i++) { centerRbs[i].GetComponent<Rigidbody>().isKinematic = true; centerRbs[i].GetComponent<ConfigurableJoint>().enablePreprocessing = false; connected_Joints[i].GetComponent<Rigidbody>().isKinematic = true; } } if(bSetTetraPositions) { Voronoi_Joint vj = TetraVoronoi.GetComponent<Voronoi_Joint>(); Vector3 thisBasePosition = transform.position; float edgeLength = (connected_Joints[0].transform.position - connected_Joints[1].transform.position).magnitude; Vector3 vfaceCenter = ( connected_Joints[0].transform.localPosition + connected_Joints[1].transform.localPosition + connected_Joints[2].transform.localPosition) / 3f; Vector3 vDir = vfaceCenter.normalized; float tetraHeight = edgeLength * Mathf.Sqrt(0.666666667f); TetraVoronoi.transform.position = transform.position + vfaceCenter + vDir * edgeLength * Mathf.Sqrt(6) / 12f; Vector3[] vTetraPos = new Vector3[4]; vTetraPos[0] = connected_Joints[0].transform.position; vTetraPos[1] = connected_Joints[1].transform.position; vTetraPos[2] = connected_Joints[2].transform.position; vTetraPos[3] = thisBasePosition + vfaceCenter + vDir*edgeLength*Mathf.Sqrt(6)/3; vj.SetPositions(ref vTetraPos); } } public void SetPositions(ref Vector3[] positions) { for(int i = 0; i < connected_Joints.Length; i++) { connected_Joints[i].transform.position = positions[i]; } } private void DoObject_1_Touched(object sender, InteractableObjectEventArgs e) { handle_State = Handle_States.TOUCHED; VU_UI.Report_Touched(vrtk_Interact_1.gameObject, e.interactingObject); } private void DoObject_1_Untouched(object sender, InteractableObjectEventArgs e) { handle_State = Handle_States.NORMAL; VU_UI.Report_UnTouched(vrtk_Interact_1.gameObject, e.interactingObject); } private void DoObject_1_Grabbed(object sender, InteractableObjectEventArgs e) { handle_State = Handle_States.GRABBED; } private void DoObject_1_Ungrabbed(object sender, InteractableObjectEventArgs e) { handle_State = Handle_States.NORMAL; } private bool isValid_Vector(Vector3 v) { if (!float.IsNaN(v.x) && !float.IsNaN(v.y) && !float.IsNaN(v.z)) { return true; } else { return false; } } public void Return_To_Start_Position() { transform.position = startPosition; } void FixedUpdate() { if (bUsePhysics) { //Angular Adjustment for (int j = 0; j < connected_Joints.Length; j++) { Vector3 vA = connected_Joints[j].transform.right; GameObject gAlign = connected_Joints[0]; //subtract y component to get projection on current XZ plane float yDot = Vector3.Dot(connected_Joints[j].transform.up, gAlign.transform.up); Vector3 yProjected = gAlign.transform.up + yDot * gAlign.transform.up; float torque = torque_Coefficient * Vector3.Dot(yProjected, connected_Joints[j].transform.forward); Rigidbody rbc = connected_Joints[j].GetComponent<Rigidbody>(); rbc.AddTorque(rbc.transform.up * torque); } //Distribute around sphere - Voronoi Action foreach (GameObject go in connected_Joints) { Rigidbody rb = go.GetComponent<Rigidbody>(); Rigidbody rbInner; Vector3 vFrom; Vector3 vSum; Vector3 vRecip; foreach (GameObject gInner in connected_Joints) { vSum = Vector3.zero; float r;//Radius from Neighbor if (go != gInner) { rbInner = gInner.GetComponent<Rigidbody>(); vFrom = rb.position - rbInner.position; r = vFrom.magnitude; vRecip = (1f / r) * vFrom.normalized; vSum += vRecip; } if (isValid_Vector(vSum)) { rb.AddForce(outerforceMag * vSum); } } } //Pull centerRbs into Center of Sphere Vector3 vDiff; foreach (GameObject gCent in centerRbs) { Rigidbody rb = gCent.GetComponent<Rigidbody>(); vDiff = transform.position - rb.position; rb.velocity = vDiff / Time.fixedDeltaTime; } if (bPrint_Debug) { //for (int i = 0; i < 4; i++) //{ // for (int j = 0; j < 3; j++) // { // print("VN_[" + i.ToString() + "," + j.ToString() + "] points to " + vN_Points_to[i, j].ToString()); // } //} bPrint_Debug = false; } } } Color curr_Color; Color curr_dot_Color; Color targ_Color; Color targ_dot_Color; float theta = 390; float target_theta = 0; public void Animate_Handle_Material()//UI HANDLE { curr_Color = Color.Lerp(curr_Color, targ_Color, Time.deltaTime * 1.61803f); curr_dot_Color = Color.Lerp(curr_dot_Color, targ_dot_Color, Time.deltaTime * 1.61803f); if (handle_State == Handle_States.NORMAL) { //target_theta = 300; targ_Color = handle_Base_Col; } else if (handle_State == Handle_States.TOUCHED) { //target_theta = 390; targ_Color = handle_Touched_Col; } else if (handle_State == Handle_States.GRABBED) { //target_theta = 570; targ_Color = handle_Grabbed_Col; } Renderer rend = GetComponent<Renderer>(); rend.material.SetColor("_Color", curr_Color); rend.material.SetColor("_EmissionColor", curr_Color); } public void Toggle_Hi_Res_From_Voronoi() { bvToggle_Hi_Res.isON = !bvToggle_Hi_Res.isON; six_splines = TetraVoronoi.GetComponentInChildren<Six_Splines>(); six_splines.Set_Hi_Res(bvToggle_Hi_Res.isON); twelve_Splines.Set_Hi_Res(bvToggle_Hi_Res.isON); } private void Update() { //Animate_Handle_Material(); if (geo == GEOMETRY.TETRA) { cj_12_EndPoints[0] = connected_Joints[0].transform.localPosition; cj_12_EndPoints[1] = connected_Joints[1].transform.localPosition; cj_12_EndPoints[2] = connected_Joints[0].transform.localPosition; cj_12_EndPoints[3] = connected_Joints[2].transform.localPosition; cj_12_EndPoints[4] = connected_Joints[0].transform.localPosition; cj_12_EndPoints[5] = connected_Joints[3].transform.localPosition; cj_12_EndPoints[6] = connected_Joints[1].transform.localPosition; cj_12_EndPoints[7] = connected_Joints[2].transform.localPosition; cj_12_EndPoints[8] = connected_Joints[1].transform.localPosition; cj_12_EndPoints[9] = connected_Joints[3].transform.localPosition; cj_12_EndPoints[10] = connected_Joints[2].transform.localPosition; cj_12_EndPoints[11] = connected_Joints[3].transform.localPosition; six_splines.Generate_Splines(cj_12_EndPoints, transform.position); } else if(geo == GEOMETRY.OCTA) { cj_24_EndPoints[0] = connected_Joints[0].transform.localPosition; cj_24_EndPoints[1] = connected_Joints[1].transform.localPosition; cj_24_EndPoints[2] = connected_Joints[0].transform.localPosition; cj_24_EndPoints[3] = connected_Joints[2].transform.localPosition; cj_24_EndPoints[4] = connected_Joints[0].transform.localPosition; cj_24_EndPoints[5] = connected_Joints[3].transform.localPosition; cj_24_EndPoints[6] = connected_Joints[0].transform.localPosition; cj_24_EndPoints[7] = connected_Joints[4].transform.localPosition; cj_24_EndPoints[8] = connected_Joints[1].transform.localPosition; cj_24_EndPoints[9] = connected_Joints[2].transform.localPosition; cj_24_EndPoints[10] = connected_Joints[1].transform.localPosition; cj_24_EndPoints[11] = connected_Joints[5].transform.localPosition; cj_24_EndPoints[12] = connected_Joints[1].transform.localPosition; cj_24_EndPoints[13] = connected_Joints[4].transform.localPosition; cj_24_EndPoints[14] = connected_Joints[2].transform.localPosition; cj_24_EndPoints[15] = connected_Joints[5].transform.localPosition; cj_24_EndPoints[16] = connected_Joints[2].transform.localPosition; cj_24_EndPoints[17] = connected_Joints[3].transform.localPosition; cj_24_EndPoints[18] = connected_Joints[3].transform.localPosition; cj_24_EndPoints[19] = connected_Joints[5].transform.localPosition; cj_24_EndPoints[20] = connected_Joints[3].transform.localPosition; cj_24_EndPoints[21] = connected_Joints[4].transform.localPosition; cj_24_EndPoints[22] = connected_Joints[4].transform.localPosition; cj_24_EndPoints[23] = connected_Joints[5].transform.localPosition; twelve_Splines.Generate_Splines(cj_24_EndPoints, transform.position); } } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using ProceduralToolkit; using VRTK; using UnityEngine.UI; using VRTK.GrabAttachMechanics; public class Six_Splines : MonoBehaviour { public Face_Tetra faces; public GameObject test_Octahedron; public GameObject Horn_Handle_Prefab; private GameObject[] tangent_Handles = new GameObject[14]; [Range(0, 100f)] public float scale_tangent_Handles = 27f; private bool bEdge_Rotation_On = false; private float edge_Angular_Rate = 0f; public Slider sld_Edge_Angular_Rate; private bool bHandles_On = true; public Button_VU bvAngular_On; private GameObject go_cj_0; public Button_VU[] bvEdge_Switches; private bool[] bEdge_Switch = new bool[6]; public Button_VU bvHorns_Handles_On; public Slider sld_Tangent; public Slider sld_Extend; public float tan_Slide_Val = 0; public float extend_Slide_Val = 0; public Slider_VU sv_Tangent_Adjust; public Slider_VU sv_Extend_Adjust; public bool bHi_Res_On = false; public bool bRun_Once = false; public Button_VU bv_Outii; //One Face Opposite Tangents public Vector3[] tetra_Edges = new Vector3[12]; //edge 0 -> 0,1 | edge 1 -> 2-3 etc. private VRTK_InteractableObject interact; private ArgosMeshDraft aMD_Spline_Green; private ArgosMeshDraft aMD_Spline_Red; private ArgosMeshDraft aMD_Spline_Blue; private ArgosMeshDraft aMD_Spline_Yellow; private ArgosMeshDraft aMD_Spline_Orange; private ArgosMeshDraft aMD_Spline_Violet; private ArgosMeshDraft aMD_Spline_Cross; public GameObject spline_Green; public GameObject spline_Red; public GameObject spline_Blue; public GameObject spline_Yellow; public GameObject spline_Orange; public GameObject spline_Violet; public GameObject spline_Cross; public float[] spline_lens_Green = new float[256]; public float[] spline_lens_Red = new float[256]; public float[] spline_lens_Blue = new float[256]; public float[] spline_lens_Yellow = new float[256]; public float[] spline_lens_Orange = new float[256]; public float[] spline_lens_Violet = new float[256]; public float[] spline_lens_Cross = new float[256]; private List<Vector3> lst_SplineGreen = new List<Vector3>(); private List<Vector3> lst_SplineRed = new List<Vector3>(); private List<Vector3> lst_SplineBlue = new List<Vector3>(); private List<Vector3> lst_SplineYellow = new List<Vector3>(); private List<Vector3> lst_SplineOrange = new List<Vector3>(); private List<Vector3> lst_SplineViolet = new List<Vector3>(); //private List<Vector3> lst_SplineCross = new List<Vector3>(); private Vector3 p0_1, p0_2; private Vector3 p1_1, p1_2; private Vector3 p2_1, p2_2; private Vector3 p3_1, p3_2; private Vector3 p4_1, p4_2; private Vector3 p5_1, p5_2; [Range(0, 0.5f)] public float radial_Mag = 0.5f; [Range(-20, 20f)] public float tangent_Mag = 1f; [Range(-20, 20f)] public float tRad = 0.0f; public bool bUpdate = false; public bool bTangents_From_Octahedron = false; public Twelve_Splines twelve_Splines; private VU_UI_MANAGER VU_UI; void Start () { bv_Outii.isON = false; //tan_Slide_Val = sld_Tangent.value; //extend_Slide_Val = sld_Extend.value; //edge_Angular_Rate = sld_Edge_Angular_Rate.value; for (int i = 0; i<6; i++) { bEdge_Switch[i] = false; } VU_UI = VU_UI_MANAGER.Instance; aMD_Spline_Green = new ArgosMeshDraft(); aMD_Spline_Red = new ArgosMeshDraft(); aMD_Spline_Blue = new ArgosMeshDraft(); aMD_Spline_Yellow = new ArgosMeshDraft(); aMD_Spline_Orange = new ArgosMeshDraft(); aMD_Spline_Violet = new ArgosMeshDraft(); aMD_Spline_Cross = new ArgosMeshDraft(); //Generate_Splines(); spline_Green.GetComponent<MeshFilter>().mesh.MarkDynamic(); spline_Red.GetComponent<MeshFilter>().mesh.MarkDynamic(); spline_Blue.GetComponent<MeshFilter>().mesh.MarkDynamic(); spline_Yellow.GetComponent<MeshFilter>().mesh.MarkDynamic(); spline_Orange.GetComponent<MeshFilter>().mesh.MarkDynamic(); spline_Violet.GetComponent<MeshFilter>().mesh.MarkDynamic(); spline_Cross.GetComponent<MeshFilter>().mesh.MarkDynamic(); for (int i = 0; i < 12; i++) { tangent_Handles[i] = Instantiate(Horn_Handle_Prefab); tangent_Handles[i].transform.localPosition = Vector3.zero; tangent_Handles[i].transform.localRotation = Quaternion.identity; if (!GetComponentInParent<Voronoi_Joint>().bUsePhysics) { tangent_Handles[i].GetComponent<Rigidbody>().isKinematic = true; } } for (int i = 0; i < 12; i++) { if (i % 2 == 0) { tangent_Handles[i].GetComponent<Handle_Tangent_Interact>().Set_Dual(tangent_Handles[i + 1].GetComponent<Handle_Tangent_Interact>()); } else { tangent_Handles[i].GetComponent<Handle_Tangent_Interact>().Set_Dual(tangent_Handles[i - 1].GetComponent<Handle_Tangent_Interact>()); } } } public void Set_CJ_0_GO(GameObject cj_0_go) { go_cj_0 = cj_0_go; } public void Show_Handles(bool bON) { for (int i = 0; i < 14; i++) { tangent_Handles[i].SetActive(bON); } } //public Slider sld_Tangent; //public Slider sld_Extend; public void onSld_Tangent() { tan_Slide_Val = sld_Tangent.value; VU_UI.Set_Active_Slider(sv_Tangent_Adjust.gameObject); UI_Ladder.Instance.fine_Tuner.Active_FTS(sld_Tangent); } public void onSld_Extend() { extend_Slide_Val = sld_Extend.value; VU_UI.Set_Active_Slider(sv_Extend_Adjust.gameObject); UI_Ladder.Instance.fine_Tuner.Active_FTS(sld_Extend); } public void Set_Hi_Res(bool bON) { bHi_Res_On = bON; faces.Set_Hi_Res(bON); bRun_Once = bON; } public void onBV_Outii() { bv_Outii.isON = !bv_Outii.isON; } public void On_Edge_Switch_BV(int i) { bEdge_Switch[i] = !bEdge_Switch[i]; if(bvEdge_Switches[0] != null) { bvEdge_Switches[i].isON = bEdge_Switch[i]; } } public void onSld_Cross_Tangent() { tan_Slide_Val = sld_Tangent.value; VU_UI.Set_Active_Slider(sv_Tangent_Adjust.gameObject); UI_Ladder.Instance.fine_Tuner.Active_FTS(sld_Tangent); } public void onSld_Cross_Extend() { extend_Slide_Val = sld_Extend.value; VU_UI.Set_Active_Slider(sv_Extend_Adjust.gameObject); UI_Ladder.Instance.fine_Tuner.Active_FTS(sld_Extend); } public void On_Edge_Angular_Rotation_sld() { edge_Angular_Rate = sld_Edge_Angular_Rate.value; } public void On_Edge_Rotation_Button() { bEdge_Rotation_On = !bEdge_Rotation_On; bvAngular_On.isON = bEdge_Rotation_On; } public void OnHandles_OnOff() { bHandles_On = !bHandles_On; bvHorns_Handles_On.isON = bHandles_On; for(int i = 0; i<12; i++) { tangent_Handles[i].GetComponent<Handle_Tangent_Interact>().Show(bHandles_On); } } float ang = 0; void Update() { if (bUpdate) { if (bEdge_Rotation_On) { ang += edge_Angular_Rate * Time.deltaTime; } else { ang = 0; } for (int i = 0; i < 12; i++) { tangent_Handles[i].transform.localScale = scale_tangent_Handles * Vector3.one; tangent_Handles[i].transform.position = transform.position + transform.parent.TransformVector(tetra_Edges[i]); } Vector3 v_i1_i0; Quaternion q0, q1; Quaternion qZ_0, qZ_1; for (int i = 0; i < 6; i++) { v_i1_i0 = tangent_Handles[i*2].transform.position - tangent_Handles[i*2+1].transform.position; q0 = Quaternion.LookRotation(-v_i1_i0, tangent_Handles[i * 2].transform.position - transform.position); q1 = Quaternion.LookRotation(v_i1_i0, tangent_Handles[i * 2 + 1].transform.position - transform.position); float direction = 1f; if(bEdge_Switch[i]) { direction = -1f; } float tanDir = 1f; Quaternion q0_bub = Quaternion.identity; Quaternion q1_bub = Quaternion.identity; qZ_0 = Quaternion.Euler(0, 0, direction*ang); qZ_1 = Quaternion.Euler(0, 0, -direction*ang); tangent_Handles[i * 2].transform.rotation = q0 * qZ_0 * Quaternion.Euler(new Vector3(tanDir*tan_Slide_Val, 0, 0))*q0_bub; tangent_Handles[i * 2 + 1].transform.rotation = q1 * qZ_1 * Quaternion.Euler(new Vector3(tanDir*tan_Slide_Val, 0, 0)) * q1_bub; //if (bv_Outii.isON && i > 2) //{ // if (i == 4) // { // //tanDir = -1f; // Vector3 nYellow0 = Vector3.Cross(go_cj_0.transform.up, tangent_Handles[i * 2].transform.forward).normalized; // Vector3 nYellow1 = Vector3.Cross(tangent_Handles[i * 2 + 1].transform.forward, go_cj_0.transform.up).normalized; // Vector3 nPlanar0 = Vector3.Cross(go_cj_0.transform.up, nYellow0).normalized; // Vector3 nPlanar1 = Vector3.Cross(go_cj_0.transform.up, nYellow1).normalized; // float cosTheta0 = Vector3.Dot(nPlanar0, nYellow0); // float cosTheta1 = Vector3.Dot(nPlanar1, nYellow1); // float ang0_R = Mathf.Acos(cosTheta0); // float ang1_R = Mathf.Acos(cosTheta1); // float convR_to_D = 180f / Mathf.PI; // float ang0_D = ang0_R * convR_to_D; // float ang1_D = ang1_R * convR_to_D; // q0_bub = Quaternion.AngleAxis(ang0_D, nYellow0); // q1_bub = Quaternion.AngleAxis(2 * ang1_D, nYellow1); // tangent_Handles[i * 2].transform.localRotation = q0_bub * tangent_Handles[i * 2].transform.localRotation; // //tangent_Handles[i * 2 + 1].transform.rotation = q1_bub; // } //} tangent_Handles[i * 2].GetComponent<Handle_Tangent_Interact>().Set_Tangent_Position(extend_Slide_Val); tangent_Handles[i * 2 + 1].GetComponent<Handle_Tangent_Interact>().Set_Tangent_Position(extend_Slide_Val); } } } public void Generate_Splines(Vector3[] points, Vector3 vCenter) { if (!bHi_Res_On || bRun_Once) { bRun_Once = false; aMD_Spline_Green.Clear(); aMD_Spline_Red.Clear(); aMD_Spline_Blue.Clear(); aMD_Spline_Yellow.Clear(); aMD_Spline_Orange.Clear(); aMD_Spline_Violet.Clear(); //aMD_Spline_Cross.Clear(); lst_SplineGreen.Clear(); lst_SplineRed.Clear(); lst_SplineBlue.Clear(); lst_SplineYellow.Clear(); lst_SplineOrange.Clear(); lst_SplineViolet.Clear(); //lst_SplineCross.Clear(); for (int i = 0; i < 12; i++) { tetra_Edges[i] = points[i]; } p0_1 = points[0];//0 p0_2 = points[1];//1 p1_1 = points[2];//0 p1_2 = points[3];//2 p2_1 = points[4];//0 p2_2 = points[5];//3 p3_1 = points[6];//1 p3_2 = points[7];//2 p4_1 = points[8];//1 p4_2 = points[9];//3 p5_1 = points[10];//2 p5_2 = points[11];//3 Vector3 vTn_01, vTn_02, vTn_11, vTn_12, vTn_31, vTn_32; if (bTangents_From_Octahedron) { //0-1 vTn_01 = twelve_Splines.getTan_Han(0).GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_01 = transform.parent.InverseTransformVector(vTn_01); //1-0 vTn_02 = twelve_Splines.getTan_Han(1).GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_02 = transform.parent.InverseTransformVector(vTn_02); //-------------------------- //0-2 vTn_11 = twelve_Splines.getTan_Han(2).GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_11 = transform.parent.InverseTransformVector(vTn_11); //2-0 vTn_12 = twelve_Splines.getTan_Han(3).GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_12 = transform.parent.InverseTransformVector(vTn_12); //--------------------------- //1-2 vTn_31 = twelve_Splines.getTan_Han(8).GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_31 = transform.parent.InverseTransformVector(vTn_31); //2-1 vTn_32 = twelve_Splines.getTan_Han(9).GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_32 = transform.parent.InverseTransformVector(vTn_32); } else { //0-1 vTn_01 = tangent_Handles[0].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_01 = transform.parent.InverseTransformVector(vTn_01); //1-0 vTn_02 = tangent_Handles[1].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_02 = transform.parent.InverseTransformVector(vTn_02); //-------------------------- //0-2 vTn_11 = tangent_Handles[2].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_11 = transform.parent.InverseTransformVector(vTn_11); //2-0 vTn_12 = tangent_Handles[3].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_12 = transform.parent.InverseTransformVector(vTn_12); //--------------------------- //1-2 vTn_31 = tangent_Handles[6].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_31 = transform.parent.InverseTransformVector(vTn_31); //2-1 vTn_32 = tangent_Handles[7].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_32 = transform.parent.InverseTransformVector(vTn_32); } //--------------------------- //0-3 Vector3 vTn_21 = tangent_Handles[4].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_21 = transform.parent.InverseTransformVector(vTn_21); //3-0 Vector3 vTn_22 = tangent_Handles[5].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_22 = transform.parent.InverseTransformVector(vTn_22); //--------------------------- //1-3 Vector3 vTn_41 = tangent_Handles[8].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_41 = transform.parent.InverseTransformVector(vTn_41); //3-1 Vector3 vTn_42 = tangent_Handles[9].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_42 = transform.parent.InverseTransformVector(vTn_42); //--------------------------- //2-3 Vector3 vTn_51 = tangent_Handles[10].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_51 = transform.parent.InverseTransformVector(vTn_51); //3-2 Vector3 vTn_52 = tangent_Handles[11].GetComponent<Handle_Tangent_Interact>().Get_Tangent_Position() - vCenter; vTn_52 = transform.parent.InverseTransformVector(vTn_52); //Local Coordinates if (bv_Outii.isON) { //Mirror Vector3 vLocal_Up_0 = transform.parent.InverseTransformVector(go_cj_0.transform.up).normalized; Vector3 vHandle_Pos = tangent_Handles[6].gameObject.transform.position - vCenter; vHandle_Pos = transform.parent.InverseTransformVector(vHandle_Pos); Vector3 vTo_Tangent = vTn_31 - vHandle_Pos; float dot; dot = Vector3.Dot(vTo_Tangent, vLocal_Up_0); float mir = -2f * dot; vTn_31 += mir * vLocal_Up_0; vTn_32 += mir * vLocal_Up_0; vTn_41 += mir * vLocal_Up_0; vTn_42 += mir * vLocal_Up_0; vTn_51 += mir * vLocal_Up_0; vTn_52 += mir * vLocal_Up_0; } //--------------------------- Compute_Dist_Spline(ref lst_SplineGreen, ref spline_lens_Green, p0_1, vTn_01, vTn_02, p0_2); Compute_Dist_Spline(ref lst_SplineRed, ref spline_lens_Red, p1_1, vTn_11, vTn_12, p1_2); Compute_Dist_Spline(ref lst_SplineBlue, ref spline_lens_Blue, p2_1, vTn_21, vTn_22, p2_2); //--------------------------- Compute_Dist_Spline(ref lst_SplineYellow, ref spline_lens_Yellow, p3_1, vTn_31, vTn_32, p3_2); Compute_Dist_Spline(ref lst_SplineOrange, ref spline_lens_Orange, p4_1, vTn_41, vTn_42, p4_2); Compute_Dist_Spline(ref lst_SplineViolet, ref spline_lens_Violet, p5_1, vTn_51, vTn_52, p5_2); aMD_Spline_Green.Add(MeshDraft.Along_Spline(radial_Mag, 6, lst_SplineGreen)); aMD_Spline_Red.Add(MeshDraft.Along_Spline(radial_Mag, 6, lst_SplineRed)); aMD_Spline_Blue.Add(MeshDraft.Along_Spline(radial_Mag, 6, lst_SplineBlue)); aMD_Spline_Yellow.Add(MeshDraft.Along_Spline(radial_Mag, 6, lst_SplineYellow)); aMD_Spline_Orange.Add(MeshDraft.Along_Spline(radial_Mag, 6, lst_SplineOrange)); aMD_Spline_Violet.Add(MeshDraft.Along_Spline(radial_Mag, 6, lst_SplineViolet)); spline_Green.GetComponent<MeshFilter>().mesh = aMD_Spline_Green.ToMeshInternal(); spline_Red.GetComponent<MeshFilter>().mesh = aMD_Spline_Red.ToMeshInternal(); spline_Blue.GetComponent<MeshFilter>().mesh = aMD_Spline_Blue.ToMeshInternal(); spline_Yellow.GetComponent<MeshFilter>().mesh = aMD_Spline_Yellow.ToMeshInternal(); spline_Orange.GetComponent<MeshFilter>().mesh = aMD_Spline_Orange.ToMeshInternal(); spline_Violet.GetComponent<MeshFilter>().mesh = aMD_Spline_Violet.ToMeshInternal(); //p0 = p0_1 //p1 = p1_1 //p2 = p2_1 //Tangents // 6 & 7 -> tan 1,2 tu1 & tu2 // // tv1 = //cj_12_EndPoints[0] = connected_Joints[0].transform.localPosition; //cj_12_EndPoints[1] = connected_Joints[1].transform.localPosition; //cj_12_EndPoints[2] = connected_Joints[0].transform.localPosition; //cj_12_EndPoints[3] = connected_Joints[2].transform.localPosition; //cj_12_EndPoints[4] = connected_Joints[0].transform.localPosition; //cj_12_EndPoints[5] = connected_Joints[3].transform.localPosition; //cj_12_EndPoints[6] = connected_Joints[1].transform.localPosition; //cj_12_EndPoints[7] = connected_Joints[2].transform.localPosition; //cj_12_EndPoints[8] = connected_Joints[1].transform.localPosition; //cj_12_EndPoints[9] = connected_Joints[3].transform.localPosition; //cj_12_EndPoints[10] = connected_Joints[2].transform.localPosition; //cj_12_EndPoints[11] = connected_Joints[3].transform.localPosition; /*test_Octahedron.transform.localPosition = */ faces.Clear_Faces(); faces.Generate_Face(tetra_Edges[0], tetra_Edges[3], tetra_Edges[1], vTn_32, vTn_31, vTn_12, vTn_02, vTn_11, vTn_01 ); faces.Generate_Face(tetra_Edges[0], tetra_Edges[5], tetra_Edges[3], vTn_52, vTn_51, vTn_22, vTn_12, vTn_21, vTn_11 ); faces.Generate_Face(tetra_Edges[0], tetra_Edges[1], tetra_Edges[5], vTn_41, vTn_42, vTn_02, vTn_22, vTn_01, vTn_21 ); faces.Generate_Face(tetra_Edges[6], tetra_Edges[7], tetra_Edges[9], vTn_51, vTn_52, vTn_32, vTn_42, vTn_31, vTn_41 ); faces.toMesh_Internal(); //Generate_Face(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 tu1, Vector3 tu2, Vector3 tv1, Vector3 tv2, Vector3 tv01, Vector3 tv02) } /// <image url="$(SolutionDir)\EMB\EMB_tetra_Faces.png" scale="0.15" /> //aMD_Spline_Red.Add(MeshDraft.Along_Spline(0.007f, 6, lst_SplineRed)); //aMD_Spline_Blue.Add(MeshDraft.Along_Spline(0.007f, 6, lst_SplineBlue)); } private void Compute_Spline(ref List<Vector3> spline_lst, ref float[] lengths, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3) { float t = 0.0f; float dt = 1f / 72f; Vector3 vB = GetPointOnBezierCurve(p0, p1, p2, p3, get_Adjusted(t, ref lengths)); for (int i = 0; i < 72; i++) { vB = GetPointOnBezierCurve(p0, p1, p2, p3, get_Adjusted(t, ref lengths)); spline_lst.Add(vB); t += dt; } } private float get_Adjusted(float t, ref float[] lengths) { int i = 0; while (i < 256 && lengths[i] < t) { i++; } return (float)i / 256; } private void Compute_Dist_Spline(ref List<Vector3> spline_lst, ref float[] lengths, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3) { float t = 0.0f; float dt = 1f / 256; Vector3 vB = GetPointOnBezierCurve(p0, p1, p2, p3, t); Vector3 vB_Last = vB; float running_Len = 0; for (int i = 0; i < 256; i++) { vB = GetPointOnBezierCurve(p0, p1, p2, p3, t); running_Len += (vB - vB_Last).magnitude; lengths[i] = running_Len; vB_Last = vB; t += dt; } for (int i = 0; i < 256; i++) { lengths[i] /= running_Len; } Compute_Spline(ref spline_lst, ref lengths, p0, p1, p2, p3); } public Vector3 GetPointOnBezierCurve(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) { float u = 1f - t; float t2 = t * t; float u2 = u * u; float u3 = u2 * u; float t3 = t2 * t; Vector3 result = (u3) * p0 + (3f * u2 * t) * p1 + (3f * u * t2) * p2 + (t3) * p3; return result; } }