private void Attach(long entityID, Vector3 gearSpacePivot, CompressedPositionOrientation otherBodySpacePivot, bool force = false) { m_attachedEntityId = entityID; MyEntity otherEntity; if (MyEntities.TryGetEntityById(entityID, out otherEntity)) { Attach(otherEntity, gearSpacePivot, otherBodySpacePivot.Matrix); } }
private void AttachEntity(Vector3D pivot, MyEntity otherEntity, bool force = false) { var gearClusterMatrix = CubeGrid.Physics.RigidBody.GetRigidBodyMatrix(); var otherClusterMatrix = otherEntity.Physics.RigidBody.GetRigidBodyMatrix(); // Calculate world (cluster) matrix of pivot Matrix pivotCluster = gearClusterMatrix; pivotCluster.Translation = CubeGrid.Physics.WorldToCluster(pivot); // Convert cluser-space to local space Vector3 gearPivotPosition = (pivotCluster * Matrix.Invert(gearClusterMatrix)).Translation; Matrix other = pivotCluster * Matrix.Invert(otherClusterMatrix); CompressedPositionOrientation otherPivot = new CompressedPositionOrientation(ref other); long OtherEntity = otherEntity.EntityId; MatrixD masterToSlave = CubeGrid.WorldMatrix * MatrixD.Invert(otherEntity.WorldMatrix); m_attachedState.Value = new State() { Force = force, OtherEntityId = OtherEntity, GearPivotPosition = gearPivotPosition, OtherPivot = otherPivot, MasterToSlave = masterToSlave }; Attach(otherEntity, gearPivotPosition, other); }