예제 #1
0
        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);
        }
예제 #2
0
        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
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
 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);
     }
 }
예제 #6
0
파일: Collider.cs 프로젝트: mikecrews/FFWD
 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);
     }
 }
예제 #7
0
파일: Collider.cs 프로젝트: mikecrews/FFWD
 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);
     }
 }
예제 #8
0
        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);
        }
예제 #9
0
        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();
            }
        }
예제 #10
0
        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);
                }
            }
        }
예제 #11
0
 public Vector3 GetPointVelocity(Vector3 worldPoint)
 {
     return(body.GetLinearVelocityFromWorldPoint(VectorConverter.Convert(worldPoint, collider.to2dMode)));
 }