Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thelebaron/f51c88d65f9239ae1a961fc37408051c to your computer and use it in GitHub Desktop.
Save thelebaron/f51c88d65f9239ae1a961fc37408051c to your computer and use it in GitHub Desktop.
"Old" CreateConfigurableJoint conversion code
//replace old method CreateConfigurableJoint in LegacyJointConversionSystem.cs with this
private PhysicsJoint CreateConfigurableJoint(
//GameObjectConversionSystem system, Entity connectedEntity,
quaternion jointFrameOrientation,
LegacyJoint joint, bool3 linearLocks, bool3 linearLimited, SoftJointLimit linearLimit, SoftJointLimitSpring linearSpring, bool3 angularFree, bool3 angularLocks,
bool3 angularLimited, SoftJointLimit lowAngularXLimit, SoftJointLimit highAngularXLimit, SoftJointLimitSpring angularXLimitSpring, SoftJointLimit angularYLimit,
SoftJointLimit angularZLimit, SoftJointLimitSpring angularYZLimitSpring)
{
//var constraints = new NativeList<Constraint>(Allocator.Temp);
var constraints = new FixedList128Bytes<Constraint>();
// TODO: investigate mapping PhysX spring and damping to Unity Physics SpringFrequency and SpringDamping
var springFrequency = Constraint.DefaultSpringFrequency;
//Debug.Log("calculated " + CalculateSpringFrequencyFromSpringConstant(angularXLimitSpring.spring) + " vs " + springFrequency);
var springDamping = Constraint.DefaultSpringDamping;
if (angularLimited[0])
{
constraints.Add(Constraint.Twist(0, math.radians(new FloatRange(-highAngularXLimit.limit, -lowAngularXLimit.limit)), springFrequency, springDamping));
}
if (angularLimited[1])
{
constraints.Add(Constraint.Twist(1, math.radians(new FloatRange(-angularYLimit.limit, angularYLimit.limit)), springFrequency, springDamping));
}
if (angularLimited[2])
{
constraints.Add(Constraint.Twist(2, math.radians(new FloatRange(-angularZLimit.limit, angularZLimit.limit)), springFrequency, springDamping));
}
if (math.any(linearLimited))
{
var distanceRange = new FloatRange(-linearLimit.limit, linearLimit.limit).Sorted();
constraints.Add(new Constraint
{
ConstrainedAxes = linearLimited,
Type = ConstraintType.Linear,
Min = math.csum((int3)linearLimited) == 1 ? distanceRange.Min : 0f,
Max = distanceRange.Max,
SpringFrequency = springFrequency,
SpringDamping = springDamping
});
}
if (math.any(linearLocks))
{
constraints.Add(new Constraint
{
ConstrainedAxes = linearLocks,
Type = ConstraintType.Linear,
Min = 0,
Max = 0,
SpringFrequency = springFrequency,
SpringDamping = springDamping
});
}
if (math.any(angularLocks))
{
constraints.Add(new Constraint
{
ConstrainedAxes = angularLocks,
Type = ConstraintType.Angular,
Min = 0,
Max = 0,
SpringFrequency = springFrequency,
SpringDamping = springDamping
});
}
RigidTransform worldFromBodyA = Math.DecomposeRigidBodyTransform(joint.transform.localToWorldMatrix);
RigidTransform worldFromBodyB = joint.connectedBody == null
? RigidTransform.identity
: Math.DecomposeRigidBodyTransform(joint.connectedBody.transform.localToWorldMatrix);
var legacyWorldFromJointA = math.mul(
new RigidTransform(joint.transform.rotation, joint.transform.position),
new RigidTransform(jointFrameOrientation, joint.anchor)
);
var bodyAFromJoint = new BodyFrame(math.mul(math.inverse(worldFromBodyA), legacyWorldFromJointA));
var connectedEntity = GetPrimaryEntity(joint.connectedBody);
var isConnectedBodyConverted = joint.connectedBody == null || connectedEntity != Entity.Null;
RigidTransform bFromA = isConnectedBodyConverted ? math.mul(math.inverse(worldFromBodyB), worldFromBodyA) : worldFromBodyA;
RigidTransform bFromBSource = isConnectedBodyConverted ? RigidTransform.identity : worldFromBodyB;
var bodyBFromJoint = new BodyFrame
{
Axis = math.mul(bFromA.rot, bodyAFromJoint.Axis),
PerpendicularAxis = math.mul(bFromA.rot, bodyAFromJoint.PerpendicularAxis),
Position = math.mul(bFromBSource, new float4(joint.connectedAnchor, 1f)).xyz
};
var jointData = new PhysicsJoint
{
BodyAFromJoint = bodyAFromJoint,
BodyBFromJoint = bodyBFromJoint
};
jointData.SetConstraints(constraints);
return jointData;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment