protected override void DoAddCollider(FarseerPhysics.Dynamics.Body body, float mass) { switch (plane2d) { case Plane2d.XY: to2dMode = Physics.To2dMode.DropZ; break; case Plane2d.XZ: to2dMode = Physics.To2dMode.DropY; break; case Plane2d.YZ: to2dMode = Physics.To2dMode.DropX; break; } connectedBody = body; Vector2 scale = VectorConverter.Convert(transform.lossyScale, to2dMode); Vertices v = new Vertices(); for (int i = 0; i < relativePoints.Length; i++) { v.Add(relativePoints[i] * scale); } Physics.AddMesh(body, isTrigger, EarclipDecomposer.ConvexPartition(v), mass); }
public override void Awake() { if (collider != null) { collider.CheckDropAxis(); body = collider.connectedBody; if (body == null) { body = Physics.AddBody(); body.Position = VectorConverter.Convert(transform.position, collider.to2dMode); body.Rotation = MathHelper.ToRadians(VectorConverter.Angle(transform.rotation.eulerAngles, collider.to2dMode)); body.UserData = collider; collider.AddCollider(body, mass); } body.BodyType = (isKinematic) ? BodyType.Kinematic : BodyType.Dynamic; body.Enabled = gameObject.active; body.LinearDamping = drag; body.AngularDamping = angularDrag; body.FixedRotation = freezeRotation; RescaleMass(); if (!isKinematic) { Physics.AddRigidBody(body); } } else { #if DEBUG Debug.LogWarning("No collider set on this rigid body " + ToString()); #endif } }
protected override void DoAddCollider(Body body, float mass) { float rad = radius * Math.Max(transform.lossyScale.x, Math.Max(transform.lossyScale.y, transform.lossyScale.z)); connectedBody = body; Physics.AddCircle(body, isTrigger, rad, VectorConverter.Convert(center * transform.lossyScale, to2dMode), mass); }
protected override void DoAddCollider(Body body, float mass) { CheckDropAxis(); Vector2 sz = VectorConverter.Convert(size * transform.lossyScale, to2dMode); connectedBody = body; Physics.AddBox(body, isTrigger, sz.x, sz.y, VectorConverter.Convert(center * transform.lossyScale, to2dMode), mass); }
public void MovePosition(Vector3 position) { if (body != null) { Microsoft.Xna.Framework.Vector2 pos = VectorConverter.Convert(position, body.UserData.to2dMode); body.SetTransformIgnoreContacts(ref pos, body.Rotation); Physics.RemoveStays(collider); } }
internal void MovePosition(Vector3 position) { if (connectedBody != null && connectedBody.BodyType != BodyType.Static) { //connectedBody.SetTransform(position, connectedBody.GetAngle()); Microsoft.Xna.Framework.Vector2 pos = VectorConverter.Convert(position, to2dMode); connectedBody.SetTransformIgnoreContacts(ref pos, connectedBody.Rotation); Physics.RemoveStays(this); } }
public override void Awake() { if (rigidbody == null) { CheckDropAxis(); connectedBody = Physics.AddBody(); connectedBody.Position = VectorConverter.Convert(transform.position, to2dMode); connectedBody.Rotation = MathHelper.ToRadians(VectorConverter.Angle(transform.rotation.eulerAngles, to2dMode)); connectedBody.UserData = this; connectedBody.BodyType = BodyType.Static; AddCollider(connectedBody, 1); } }
protected override void DoAddCollider(Body body, float mass) { Microsoft.Xna.Framework.Vector2 scale = VectorConverter.Convert(transform.lossyScale, to2dMode); for (int i = 0; i < vertices.Count; i++) { Vertices v = vertices[i]; for (int j = 0; j < v.Count; j++) { v[j] = v[j] * scale; } } connectedBody = body; Physics.AddMesh(body, isTrigger, vertices, mass); }
public void AddForce(Vector3 elasticityForce, ForceMode mode) { Vector2 ef = VectorConverter.Convert(elasticityForce, body.UserData.to2dMode); switch (mode) { case ForceMode.Force: body.ApplyForce(ef, VectorConverter.Convert(gameObject.transform.position, body.UserData.to2dMode)); break; case ForceMode.Acceleration: throw new NotImplementedException(); case ForceMode.Impulse: body.ApplyLinearImpulse(ef, VectorConverter.Convert(gameObject.transform.position, body.UserData.to2dMode)); break; case ForceMode.VelocityChange: throw new NotImplementedException(); } }
protected override void DoAddCollider(Body body, float mass) { connectedBody = body; Vector2 cen = VectorConverter.Convert(center * transform.lossyScale, to2dMode); if (direction == 0 || height <= radius * 2) { float rad = radius * transform.lossyScale.z; Physics.AddCircle(body, isTrigger, rad, cen, mass); } else { if (direction == 1) { Vector2 sz = new Vector2(height - radius * 2, radius * 2); sz *= (Vector2)gameObject.transform.lossyScale; Physics.AddBox(body, isTrigger, sz.x, sz.y, cen, mass); sz /= 2; float rad = sz.y; sz.y = 0; Physics.AddCircle(body, isTrigger, rad, cen + sz, mass); Physics.AddCircle(body, isTrigger, rad, cen - sz, mass); } else { Vector2 sz = new Vector2(radius * 2, height - radius * 2); sz *= (Vector2)gameObject.transform.lossyScale; Physics.AddBox(body, isTrigger, sz.x, sz.y, cen, mass); sz /= 2; float rad = sz.x; sz.x = 0; Physics.AddCircle(body, isTrigger, rad, cen + sz, mass); Physics.AddCircle(body, isTrigger, rad, cen - sz, mass); } } }
public Vector3 GetPointVelocity(Vector3 worldPoint) { return(body.GetLinearVelocityFromWorldPoint(VectorConverter.Convert(worldPoint, collider.to2dMode))); }