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.
175 lines
4.3 KiB
175 lines
4.3 KiB
9 months ago
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
|
||
|
|
||
|
public class MappingOffset
|
||
|
{
|
||
|
//string _tName;
|
||
|
Transform _t;
|
||
|
//string _rbName;
|
||
|
Rigidbody _rb;
|
||
|
|
||
|
//the ragdoll in the physics based anim uses articulated bodies, instead of rigidbodies:
|
||
|
ArticulationBody _ab;
|
||
|
|
||
|
Quaternion _offsetRB2Bone;
|
||
|
|
||
|
|
||
|
|
||
|
private bool _isRoot = false;
|
||
|
private Vector3 _debugDistance = Vector3.zero;
|
||
|
private bool _debugWithRigidBody;
|
||
|
|
||
|
//this variables define two completely different modes. In one it updates rigidbodies from transforms, in the other it updates transforms from articulationbodies.
|
||
|
//see contstructors and function UpdateAnimation
|
||
|
private bool _updateRigidBodies = false;
|
||
|
|
||
|
Transform _tson = null;
|
||
|
|
||
|
|
||
|
|
||
|
public MappingOffset(Transform t, Rigidbody rb, Quaternion offset)
|
||
|
{
|
||
|
|
||
|
_t = t;
|
||
|
_rb = rb;
|
||
|
|
||
|
//this causes trouble with mecanim, probably because when it is done there is already an animation pose loaded
|
||
|
//_offsetRB2Bone = offset;
|
||
|
_offsetRB2Bone = Quaternion.identity;
|
||
|
|
||
|
|
||
|
_ab = null;
|
||
|
|
||
|
_updateRigidBodies = true;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
public MappingOffset(Transform t, ArticulationBody ab, Quaternion offset)
|
||
|
{
|
||
|
|
||
|
_t = t;
|
||
|
_rb = null;
|
||
|
|
||
|
//this causes trouble with mecanim, probably because when it is done there is already an animation pose loaded
|
||
|
//_offsetRB2Bone = offset;
|
||
|
_offsetRB2Bone = Quaternion.identity;
|
||
|
|
||
|
_ab = ab;
|
||
|
|
||
|
_updateRigidBodies = false;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
public void SetAsRoot(bool b = true, float offset = 0.0f)
|
||
|
{
|
||
|
|
||
|
_isRoot = b;
|
||
|
_debugDistance.z = -offset;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//this is a special function used inside RagdollControllerArtanim, it is only used to check the mapping between physical and ragdoll characters works well
|
||
|
public void SetAsRagdollcontrollerDebug(bool debugWithRigidBody)
|
||
|
{
|
||
|
_debugWithRigidBody = debugWithRigidBody;
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//public void SetSon(Transform son) {
|
||
|
|
||
|
// if (!_updateRigidBodies)
|
||
|
// Debug.LogError("using son transform only makes sense when we are in the mode that updates the rigidbodies form the transforms. Please check how you initialize this class");
|
||
|
|
||
|
// _tson = son;
|
||
|
|
||
|
|
||
|
//}
|
||
|
|
||
|
|
||
|
public bool UpdateRigidBodies { get => _updateRigidBodies; set => _updateRigidBodies = value; }
|
||
|
|
||
|
public void UpdateRotation()
|
||
|
{
|
||
|
|
||
|
if (_updateRigidBodies)
|
||
|
{
|
||
|
|
||
|
|
||
|
|
||
|
if (_debugWithRigidBody)
|
||
|
{
|
||
|
_t.transform.localRotation = _offsetRB2Bone * _rb.transform.localRotation;
|
||
|
|
||
|
if (_isRoot)
|
||
|
{
|
||
|
_t.transform.rotation = _rb.rotation;
|
||
|
_t.transform.position = _rb.position + _debugDistance;
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//THE MAIN OPERATION, used most frequently when called this function:
|
||
|
if (_isRoot)
|
||
|
{
|
||
|
_rb.transform.rotation = _t.rotation;
|
||
|
_rb.transform.position = _t.position + _debugDistance;
|
||
|
|
||
|
|
||
|
}
|
||
|
else if (_tson != null)
|
||
|
{
|
||
|
|
||
|
//the center of this thing is in the wrong position
|
||
|
// Vector3 pos = (_tson.position - _t.position);
|
||
|
// _rb.position = _t.transform.position + (pos/2) +_debugDistance;
|
||
|
|
||
|
//target.transform.rotation = animStartBone.transform.rotation* rotationOffset;
|
||
|
|
||
|
}
|
||
|
else {
|
||
|
// _rb.transform.rotation = _offsetRB2Bone * _t.rotation;
|
||
|
|
||
|
//using the local rotation makes sure we do take into account rotation of their parents (for example, the call of this function for the arm, when rotating the spine)
|
||
|
_rb.transform.localRotation = _offsetRB2Bone * _t.localRotation;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//_t.rotation = _offsetRB2Bone * _rb.transform.rotation;
|
||
|
_t.rotation = _offsetRB2Bone * _ab.transform.rotation;
|
||
|
if (_isRoot)
|
||
|
{
|
||
|
_t.position = _ab.transform.position + _debugDistance;
|
||
|
|
||
|
//TEST TEST TEST. we override the offset decided before to make it match
|
||
|
//_t.rotation = _ab.transform.rotation;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|