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.
133 lines
3.8 KiB
133 lines
3.8 KiB
9 months ago
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
public static class Utils
|
||
|
{
|
||
|
|
||
|
|
||
|
|
||
|
// Find angular velocity. The delta rotation is converted to radians within [-pi, +pi].
|
||
|
// Vector3 OldGetAngularVelocity(Quaternion from, Quaternion to, float timeDelta)
|
||
|
// {
|
||
|
// var rotationVelocity = FromToRotation(from, to);
|
||
|
// var angularVelocityInDeg = NormalizedEulerAngles(rotationVelocity.eulerAngles) / timeDelta;
|
||
|
// var angularVelocity = angularVelocityInDeg * Mathf.Deg2Rad;
|
||
|
// return angularVelocity;
|
||
|
// }
|
||
|
|
||
|
|
||
|
public static Vector3 GetAngularVelocity(Quaternion from, Quaternion to, float timeDelta = 1f)
|
||
|
{
|
||
|
Vector3 fromInDeg = Utils.GetSwingTwist(from);
|
||
|
Vector3 toInDeg = Utils.GetSwingTwist(to);
|
||
|
|
||
|
return AngularVelocityInReducedCoordinates(fromInDeg, toInDeg, timeDelta);
|
||
|
}
|
||
|
|
||
|
|
||
|
//you can also use this to calculate acceleration, right?
|
||
|
public static Vector3 AngularVelocityInReducedCoordinates(Vector3 fromIn, Vector3 toIn, float timeDelta = 1f)
|
||
|
{
|
||
|
Vector3 diff = (fromIn - toIn)*Mathf.Deg2Rad;
|
||
|
Vector3 angularVelocity = diff / timeDelta;
|
||
|
return angularVelocity;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
public static Vector3 GetSwingTwist(Quaternion localRotation)
|
||
|
{
|
||
|
|
||
|
|
||
|
Quaternion a = new Quaternion();
|
||
|
Quaternion b = new Quaternion();
|
||
|
|
||
|
|
||
|
return GetSwingTwist(localRotation, out a, out b);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
public static Vector3 GetSwingTwist(Quaternion localRotation, out Quaternion swing, out Quaternion twist)
|
||
|
{
|
||
|
|
||
|
//the decomposition in swing-twist, typically works like this:
|
||
|
|
||
|
swing = new Quaternion(0.0f, localRotation.y, localRotation.z, localRotation.w);
|
||
|
swing = swing.normalized;
|
||
|
|
||
|
//Twist: assuming q_localRotation = q_swing * q_twist
|
||
|
|
||
|
twist = Quaternion.Inverse(swing) * localRotation;
|
||
|
|
||
|
|
||
|
//double check:
|
||
|
Quaternion temp = swing * twist;
|
||
|
|
||
|
bool isTheSame = (Mathf.Abs(Quaternion.Angle(temp, localRotation)) < 0.001f);
|
||
|
|
||
|
|
||
|
if (!isTheSame)
|
||
|
Debug.LogError("I have: " + temp + "which does not match: " + localRotation + "because their angle is: " + Quaternion.Angle(temp, localRotation));
|
||
|
|
||
|
|
||
|
Vector3 InReducedCoord = new Vector3(twist.eulerAngles.x, swing.eulerAngles.y, swing.eulerAngles.z); //this is consistent with how the values are stored in ArticulationBody:
|
||
|
|
||
|
|
||
|
//we make sure we keep the values nearest to 0 (with a modulus)
|
||
|
if (Mathf.Abs(InReducedCoord.x - 360) < Mathf.Abs(InReducedCoord.x))
|
||
|
InReducedCoord.x = (InReducedCoord.x - 360);
|
||
|
if (Mathf.Abs(InReducedCoord.y - 360) < Mathf.Abs(InReducedCoord.y))
|
||
|
InReducedCoord.y = (InReducedCoord.y - 360);
|
||
|
if (Mathf.Abs(InReducedCoord.z - 360) < Mathf.Abs(InReducedCoord.z))
|
||
|
InReducedCoord.z = (InReducedCoord.z - 360);
|
||
|
|
||
|
return InReducedCoord;
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
public static ArticulationReducedSpace GetReducedSpaceFromTargetVector3(Vector3 target) {
|
||
|
|
||
|
ArticulationReducedSpace ars = new ArticulationReducedSpace();
|
||
|
ars.dofCount = 3;
|
||
|
ars[0] = target.x;
|
||
|
ars[1] = target.y;
|
||
|
ars[2] = target.z;
|
||
|
|
||
|
return ars;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
public static Vector3 GetArticulationReducedSpaceInVector3(ArticulationReducedSpace ars)
|
||
|
{
|
||
|
Vector3 result = Vector3.zero;// new Vector3();
|
||
|
|
||
|
if (ars.dofCount > 0)
|
||
|
result.x = ars[0];
|
||
|
if (ars.dofCount > 1)
|
||
|
result.y = ars[1];
|
||
|
if (ars.dofCount > 2)
|
||
|
result.z = ars[2];
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
// Return rotation from one rotation to another
|
||
|
public static Quaternion FromToRotation(Quaternion from, Quaternion to)
|
||
|
{
|
||
|
if (to == from) return Quaternion.identity;
|
||
|
|
||
|
return to * Quaternion.Inverse(from);
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|