Pascal Serrarens 17741d862a First commit
2022-01-12 10:50:57 +01:00

105 lines
4.6 KiB
C#

using Passer.Humanoid;
using UnityEngine;
namespace Passer {
public class CalibrationPoint : MonoBehaviour {
public Transform leftCalibrationPoint;
public Transform rightCalibrationPoint;
public bool leftDetected = false;
public bool rightDetected = false;
public float rotationMargin = 5;
public float positionMargin = 0.01F;
protected HumanoidControl humanoid;
protected Transform leftController;
protected Transform rightController;
protected LineRenderer leftLineRenderer;
protected LineRenderer rightLineRenderer;
virtual protected void Awake() {
humanoid = GetComponentInParent<HumanoidControl>();
}
virtual protected void Update() {
if (humanoid == null || leftCalibrationPoint == null || rightCalibrationPoint == null)
return;
//#if hOCULUS && (UNITY_STANDALONE_WIN || UNITY_ANDROID)
// if (leftController == null)
// leftController = humanoid.leftHandTarget.oculus.sensorTransform;
// if (rightController == null)
// rightController = humanoid.rightHandTarget.oculus.sensorTransform;
// if (leftLineRenderer == null && leftController != null && rightController != null) {
// Vector3 localPosition = leftCalibrationPoint.InverseTransformPoint(rightCalibrationPoint.position);
// localPosition = Vector3.Scale(localPosition, rightCalibrationPoint.lossyScale);
// leftLineRenderer = AddLineRenderer(leftController.gameObject, localPosition);
// }
// if (rightLineRenderer == null && leftController != null && rightController != null) {
// Vector3 localPosition = rightCalibrationPoint.InverseTransformPoint(leftCalibrationPoint.position);
// localPosition = Vector3.Scale(localPosition, rightCalibrationPoint.lossyScale);
// rightLineRenderer = AddLineRenderer(rightController.gameObject, localPosition);
// }
//#endif
if (leftController == null || rightController == null)
return;
leftDetected = DetectLeftFromRight();
rightDetected = DetectRightFromLeft();
if (leftDetected && rightDetected) {
Vector3 direction = rightController.position - leftController.position;
Vector3 calibrationDirection = rightCalibrationPoint.position - leftCalibrationPoint.position;
Quaternion rotation = Quaternion.FromToRotation(direction, calibrationDirection);
humanoid.AdjustTracking(Vector3.zero, rotation);
Vector3 centerControllerPosition = (leftController.position + rightController.position) / 2;
Vector3 centerCalibrationPosition = (leftCalibrationPoint.position + rightCalibrationPoint.position) / 2;
Vector3 translation = centerCalibrationPosition - centerControllerPosition;
humanoid.AdjustTracking(translation, Quaternion.identity);
this.gameObject.SetActive(false);
Destroy(leftLineRenderer);
Destroy(rightLineRenderer);
}
}
public void StartCalibrate() {
this.gameObject.SetActive(true);
}
virtual protected bool DetectRightFromLeft() {
Vector3 calibrationPosition = leftCalibrationPoint.InverseTransformPoint(rightCalibrationPoint.position);
calibrationPosition = Vector3.Scale(calibrationPosition, leftCalibrationPoint.lossyScale);
Vector3 sollPosition = leftController.TransformPoint(calibrationPosition);
float distance = Vector3.Distance(sollPosition, rightController.position);
return distance < positionMargin;
}
virtual protected bool DetectLeftFromRight() {
Vector3 calibrationPosition = rightCalibrationPoint.InverseTransformPoint(leftCalibrationPoint.position);
calibrationPosition = Vector3.Scale(calibrationPosition, rightCalibrationPoint.lossyScale);
Vector3 sollPosition = rightController.TransformPoint(calibrationPosition);
float distance = Vector3.Distance(sollPosition, leftController.position);
return distance < positionMargin;
}
virtual protected LineRenderer AddLineRenderer(GameObject obj, Vector3 vector) {
LineRenderer renderer = obj.AddComponent<LineRenderer>();
renderer.useWorldSpace = false;
renderer.widthMultiplier = 0.01F;
renderer.SetPosition(1, vector);
return renderer;
}
}
}