implementation of drecon in unity 2022 lts forked from: https://github.com/joanllobera/marathon-envs
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 lines
6.9 KiB

9 months ago
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class DebugJoints : MonoBehaviour
{
public float SphereSize = 0.03f;
static Color[] _axisColor = {
new Color(219f / 255, 62f / 255, 29f / 255, .93f),
new Color(154f / 255, 243f / 255, 72f / 255, .93f),
new Color(58f / 255, 122f / 255, 248f / 255, .93f)};
static Vector3[] _axisVector = { Vector3.right, Vector3.up, Vector3.forward };
ArticulationBody _body;
ArticulationBody _parentBody;
MarathonTestBedController _debugController;
// Start is called before the first frame update
ManyWorlds.SpawnableEnv _spawnableEnv;
MocapControllerArtanim _mocapController;
Rigidbody _target;
public Vector3 TargetRotationInJointSpace;
public Vector3 RotationInJointSpace;
public Vector3 RotationInJointSpaceError;
public Vector3 RotationInJointSpaceErrorRad;
public Vector3 JointPositionDeg;
public Vector3 JointTargetDeg;
public Vector3 JointPositionRad;
public Vector3 JointTargetRad;
void Start()
{
_body = GetComponent<ArticulationBody>();
_parentBody = _body.transform.parent.GetComponentInParent<ArticulationBody>();
_debugController = FindObjectOfType<MarathonTestBedController>();
_spawnableEnv = GetComponentInParent<ManyWorlds.SpawnableEnv>();
_mocapController = _spawnableEnv.GetComponentInChildren<MocapControllerArtanim>();
var mocapBodyParts = _mocapController.GetComponentsInChildren<Rigidbody>().ToList();
_target = mocapBodyParts.First(x=>x.name == _body.name);
}
// Update is called once per frame
void FixedUpdate()
{
if (_body == null)
return;
if (_body.jointType != ArticulationJointType.SphericalJoint)
return;
RotationInJointSpace = -(Quaternion.Inverse(_body.anchorRotation) * Quaternion.Inverse(_body.transform.localRotation) * _body.parentAnchorRotation).eulerAngles;
TargetRotationInJointSpace = -(Quaternion.Inverse(_body.anchorRotation) * Quaternion.Inverse(_target.transform.localRotation) * _body.parentAnchorRotation).eulerAngles;
RotationInJointSpaceError = TargetRotationInJointSpace-RotationInJointSpace;
RotationInJointSpace = new Vector3(
Mathf.DeltaAngle(0, RotationInJointSpace.x),
Mathf.DeltaAngle(0, RotationInJointSpace.y),
Mathf.DeltaAngle(0, RotationInJointSpace.z));
TargetRotationInJointSpace = new Vector3(
Mathf.DeltaAngle(0, TargetRotationInJointSpace.x),
Mathf.DeltaAngle(0, TargetRotationInJointSpace.y),
Mathf.DeltaAngle(0, TargetRotationInJointSpace.z));
RotationInJointSpaceError = new Vector3(
Mathf.DeltaAngle(0, RotationInJointSpaceError.x),
Mathf.DeltaAngle(0, RotationInJointSpaceError.y),
Mathf.DeltaAngle(0, RotationInJointSpaceError.z));
RotationInJointSpaceErrorRad = RotationInJointSpaceError * Mathf.Deg2Rad;
JointTargetDeg.x = TargetRotationInJointSpace.y;
JointTargetDeg.y = TargetRotationInJointSpace.z;
JointTargetDeg.z = TargetRotationInJointSpace.x;
var jointPosition = _body.jointPosition;
JointPositionDeg = Vector3.zero;
int i = 0;
if (_body.twistLock == ArticulationDofLock.LimitedMotion)
JointPositionDeg.x = jointPosition[i++];
if (_body.swingYLock == ArticulationDofLock.LimitedMotion)
JointPositionDeg.y = jointPosition[i++];
if (_body.swingZLock == ArticulationDofLock.LimitedMotion)
JointPositionDeg.z = jointPosition[i++];
float stiffness = 1000f;
float damping = 100f;
JointPositionDeg *= Mathf.Rad2Deg;
bool dontUpdateMotor = _debugController.DontUpdateMotor;
dontUpdateMotor &= _debugController.isActiveAndEnabled;
dontUpdateMotor &= _debugController.gameObject.activeInHierarchy;
if(dontUpdateMotor)
{
// var drive = _body.yDrive;
// drive.stiffness = stiffness;
// drive.damping = damping;
// drive.target = JointTargetDeg.x;
// _body.yDrive = drive;
// drive = _body.zDrive;
// drive.stiffness = stiffness;
// drive.damping = damping;
// drive.target = JointTargetDeg.y;
// _body.zDrive = drive;
// drive = _body.xDrive;
// drive.stiffness = stiffness;
// drive.damping = damping;
// drive.target = JointTargetDeg.z;
// _body.xDrive = drive;
var drive = _body.xDrive;
drive.stiffness = stiffness;
drive.damping = damping;
drive.target = JointTargetDeg.x;
_body.xDrive = drive;
drive = _body.yDrive;
drive.stiffness = stiffness;
drive.damping = damping;
drive.target = JointTargetDeg.y;
_body.yDrive = drive;
drive = _body.zDrive;
drive.stiffness = stiffness;
drive.damping = damping;
drive.target = JointTargetDeg.z;
_body.zDrive = drive;
}
else
{
// var drive = _body.yDrive;
// JointTargetDeg = Vector3.zero;
// JointTargetDeg.x = drive.target;
// drive = _body.zDrive;
// JointTargetDeg.y = drive.target;
// drive = _body.xDrive;
// JointTargetDeg.z = drive.target;
var drive = _body.xDrive;
JointTargetDeg = Vector3.zero;
JointTargetDeg.x = drive.target;
drive = _body.yDrive;
JointTargetDeg.y = drive.target;
drive = _body.zDrive;
JointTargetDeg.z = drive.target;
}
JointPositionRad = JointPositionDeg * Mathf.Deg2Rad;
JointTargetRad = JointTargetDeg * Mathf.Deg2Rad;
}
public static Quaternion FromToRotation(Quaternion from, Quaternion to) {
if (to == from) return Quaternion.identity;
return to * Quaternion.Inverse(from);
}
// void OnDrawGizmos()
void OnDrawGizmosSelected()
{
if (_body == null)
return;
Gizmos.color = Color.white;
Vector3 position = _body.transform.TransformPoint(_body.anchorPosition);
Quaternion rotation = _body.transform.rotation * _body.anchorRotation;
for (int i = 0; i < _axisColor.Length; i++)
{
var axisColor = _axisColor[i];
var axis = _axisVector[i];
Gizmos.color = axisColor;
// Vector3 rotationEul = _body.transform.TransformDirection(_body.anchorRotation * axis);
Vector3 rotationEul = rotation * axis;
Gizmos.DrawSphere(position, SphereSize);
Vector3 direction = rotationEul;
Gizmos.DrawRay(position, direction);
}
}
}