using Unity.Entities; using Unity.Mathematics; namespace Unity.Physics.Authoring { public class RigidJoint : BallAndSocketJoint { public quaternion OrientationLocal = quaternion.identity; public quaternion OrientationInConnectedEntity = quaternion.identity; public override void UpdateAuto() { base.UpdateAuto(); if (AutoSetConnected) { RigidTransform bFromA = math.mul(math.inverse(worldFromB), worldFromA); OrientationInConnectedEntity = math.mul(bFromA.rot, OrientationLocal); } { OrientationLocal = math.normalize(OrientationLocal); OrientationInConnectedEntity = math.normalize(OrientationInConnectedEntity); } } } class RigidJointBaker : JointBaker { public override void Bake(RigidJoint authoring) { authoring.UpdateAuto(); var physicsJoint = PhysicsJoint.CreateFixed( new RigidTransform(authoring.OrientationLocal, authoring.PositionLocal), new RigidTransform(authoring.OrientationInConnectedEntity, authoring.PositionInConnectedEntity) ); physicsJoint.SetImpulseEventThresholdAllConstraints(authoring.MaxImpulse); var constraintBodyPair = GetConstrainedBodyPair(authoring); uint worldIndex = GetWorldIndexFromBaseJoint(authoring); CreateJointEntity(worldIndex, constraintBodyPair, physicsJoint); } } }