public void DestroyConstraint() { duringCreateDestroy = true; var physicsWorldData = GetPhysicsWorldData(false); if (physicsWorldData != null) { if (constraintRigid != null) { if (physicsWorldData.world.JointList.Contains(constraintRigid)) { physicsWorldData.world.Remove(constraintRigid); } } } created = false; creationBodyA = null; creationBodyB = null; constraintRigid = null; //softAnchorModeClosestNodeIndex = -1; duringCreateDestroy = false; }
protected override Joint OnCreateConstraint(Component_PhysicalBody2D creationBodyA, Component_PhysicalBody2D creationBodyB) { var anchor1 = Physics2DUtility.Convert(TransformV.Position.ToVector2()); var anchor2 = Physics2DUtility.Convert((TransformV * new Vector3(1, 0, 0)).ToVector2()); return(new DistanceJoint(creationBodyA.Physics2DBody, creationBodyB.Physics2DBody, anchor1, anchor2, true)); }
protected override Joint OnCreateConstraint(Component_PhysicalBody2D creationBodyA, Component_PhysicalBody2D creationBodyB) { var anchor = Physics2DUtility.Convert(TransformV.Position.ToVector2()); var angle = -MathEx.DegreeToRadian(TransformV.Rotation.ToAngles().Yaw); var axis = Physics2DUtility.Convert(new Vector2(Math.Cos(angle), Math.Sin(angle))); return(new PrismaticJoint(creationBodyA.Physics2DBody, creationBodyB.Physics2DBody, anchor, anchor, axis, true)); }
protected override Joint OnCreateConstraint(Component_PhysicalBody2D creationBodyA, Component_PhysicalBody2D creationBodyB) { var anchor = Physics2DUtility.Convert(TransformV.Position.ToVector2()); return(new WeldJoint(creationBodyA.Physics2DBody, creationBodyB.Physics2DBody, anchor, anchor, true)); }
void CreateConstraint() { if (constraintRigid != null) { Log.Fatal("Component_Constraint2D: CreateConstraint: constraintRigid != null."); } if (!EnabledInHierarchy) { Log.Fatal("Component_Constraint2D: CreateConstraint: !EnabledInHierarchy."); } var physicsWorldData = GetPhysicsWorldData(true); if (physicsWorldData == null) { return; } duringCreateDestroy = true; try { var ba = BodyA.Value; var bb = BodyB.Value; //check bodies are enabled if (ba != null && ba.Physics2DBody == null) { return; } if (bb != null && bb.Physics2DBody == null) { return; } //check no bodies if (ba == null && bb == null) { return; } created = true; creationBodyA = ba; creationBodyB = bb; //transform without Scale var transform = Transform.Value; var t = transform.ToMatrix4(); //var t = new Matrix4( transform.Rotation.ToMatrix3(), transform.Position ); if (creationBodyA != null && creationBodyB != null) { constraintRigid = OnCreateConstraint(creationBodyA, creationBodyB); var bodyATransformFull = creationBodyA.Transform.Value; var bodyATransform = new Matrix4(bodyATransformFull.Rotation.ToMatrix3(), bodyATransformFull.Position); constraintAFrame = bodyATransform.GetInverse() * t; } //else //{ //var body = creationBodyA ?? creationBodyB; //var bodyTransformFull = body.Transform.Value; //var bodyTransform = new Matrix4( bodyTransformFull.Rotation.ToMatrix3(), bodyTransformFull.Position ); //constraintAFrame = bodyTransform.GetInverse() * t; //var mat = BulletPhysicsUtility.Convert( constraintAFrame ); //constraintRigid = new Generic6DofSpring2Constraint( (RigidBody)body.BulletBody, mat ); //} if (constraintRigid != null) { constraintRigid.CollideConnected = CollisionsBetweenLinkedBodies; OnCreateConstraintApplyParameters(); constraintRigid.Tag = this; physicsWorldData.world.Add(constraintRigid); } } finally { duringCreateDestroy = false; } }
protected abstract Joint OnCreateConstraint(Component_PhysicalBody2D creationBodyA, Component_PhysicalBody2D creationBodyB);