IEnumerator StoreCalibrationData() { //re-get the OSC objects RigidbodyDefinition def_xz, def_minxminz; if (OptiTrackOSCClient.GetRigidbody(strXZ, out def_xz)) { vXZOsc = def_xz.position; } if (OptiTrackOSCClient.GetRigidbody(strMinXMinZ, out def_minxminz)) { vMinXMinZOsc = def_minxminz.position; } //store our anchored calibration data (virtual positions of vXZ = goXZ.gameObject.transform.position; vMinXMinZ = goMinXMinZ.gameObject.transform.position; //store average y-offset for all anchors (gives user some leeway for error)... do we even need this? yOffset += vXZ.y - vXZOsc.y; yOffset += vMinXMinZ.y - vMinXMinZOsc.y; yOffset = yOffset * .5f; //IDEA 1b //determine offset between vXZOsc and anchor Vector3 vXZOffset = vXZOsc - vXZ; //compare the "same" line, unrotated v rotated, to determine angle between Vector3 v1, v2; v1 = vMinXMinZ - vXZ; //rotated v2 = vMinXMinZOsc - vXZOsc; //unrotated //align the height values v1.y = v2.y; float angle = Vector3.Angle(v1, v2); //does this return a signed value? NOPE Vector3 cross = Vector3.Cross(v1, v2); if (cross.y < 0) { angle = -angle; //hope this works } //clear old anchor! if (anchorCenter != null) { WorldAnchorManager.Instance.RemoveAnchor(optitrackCenter.gameObject); yield return(new WaitForSeconds(.25f)); store.Delete(strCenter); yield return(new WaitForSeconds(.25f)); } //HACK because of bug when re-anchoring a pre-existing (loaded) anchor (snaps to old position), re/de/re-anchor fixes this WorldAnchorManager.Instance.AttachAnchor(optitrackCenter.gameObject, strCenter); yield return(new WaitForSeconds(.25f)); WorldAnchorManager.Instance.RemoveAnchor(optitrackCenter.gameObject); yield return(new WaitForSeconds(.25f)); //rotate world center around this angle (how do I know which direction, does this matter? optitrackCenter.transform.rotation = Quaternion.Euler(0, -angle, 0); //rotate the optitrack XZ over the same angle Vector3 rotatedXZ = Quaternion.Euler(0, -angle, 0) * vXZOsc; //subtract this from XZ Object position to get "real center" and position world center there optitrackCenter.position = vXZ - rotatedXZ * (v1.magnitude / v2.magnitude); //take scale diff into account //apply scale OptiTrackOSCClient oscClient = optitrackCenter.GetComponent <OptiTrackOSCClient>(); oscClient.scale = (v1.magnitude / v2.magnitude); //for some reason this snaps it to an earlier position? UGH WorldAnchorManager.Instance.AttachAnchor(oscClient.gameObject, strCenter); yield return(new WaitForSeconds(5f)); //if followup scene is not null, go there... if (followupScene != null) { SceneManager.LoadScene(followupScene); } }
public bool MockCalibration(ref Vector3 center, ref float rot, ref float scale, ref Vector3 tr, ref Vector3 bl, ref Vector3 osctr, ref Vector3 oscbl, ref float yOffset) { if (!readyToCalibrate) { return(false); } //re-get the OSC objects RigidbodyDefinition def_xz, def_minxminz; if (OptiTrackOSCClient.GetRigidbody(strXZ, out def_xz)) { osctr = def_xz.position; } if (OptiTrackOSCClient.GetRigidbody(strMinXMinZ, out def_minxminz)) { oscbl = def_minxminz.position; } //store our anchored calibration data (virtual positions of tr = goXZ.gameObject.transform.position; bl = goMinXMinZ.gameObject.transform.position; //store average y-offset for all anchors (gives user some leeway for error)... do we even need this? yOffset += tr.y - osctr.y; yOffset += bl.y - oscbl.y; yOffset = yOffset * .5f; //IDEA 1b //determine offset between vXZOsc and anchor Vector3 vXZOffset = osctr - tr; //compare the "same" line, unrotated v rotated, to determine angle between Vector3 v1, v2; v1 = bl - tr; //rotated v2 = oscbl - osctr; //unrotated //align the height values v1.y = v2.y; rot = Vector3.Angle(v1, v2); //does this return a signed value? NOPE Vector3 cross = Vector3.Cross(v1, v2); if (cross.y < 0) { rot = -rot; //hope this works } //rotate world center around this angle (how do I know which direction, does this matter? //optitrackCenter.transform.rotation = Quaternion.Euler(0, -rot, 0); //rotate the optitrack XZ over the same angle Vector3 rotatedXZ = Quaternion.Euler(0, -rot, 0) * osctr; //subtract this from XZ Object position to get "real center" and position world center there center = tr - rotatedXZ * (v1.magnitude / v2.magnitude); //take scale diff into account //apply scale //OptiTrackOSCClient oscClient = optitrackCenter.GetComponent<OptiTrackOSCClient>(); //oscClient.scale = (v1.magnitude / v2.magnitude); scale = (v1.magnitude / v2.magnitude); return(true); }