public BasicJoint3D(IWorld world, IBody3D body1, IBody3D body2, TSVector anchorPosition, TSVector anchorPosition2) : base((World)world)
        {
            firstBody  = body1;
            secondBody = body2;
            //hingeA = hingeAxis;
            worldPointConstraint = new FixedPoint[2];
            ///hingeAxis *= FP.Half;
            TSVector anchor = anchorPosition;
            //TSVector.Add(ref anchor, ref hingeAxis, out anchor);
            TSVector anchor2 = anchorPosition2;


            //TSVector.Subtract(ref anchor2, ref hingeAxis, out anchor2);

            //pointLock = new PointPointDistance((RigidBody)body1, (RigidBody)body2, position, position);
            //pointLock.Distance = 0;
            //pointLock.Behavior = PointPointDistance.DistanceBehavior.LimitMaximumDistance;


            worldPointConstraint[0] = new FixedPoint((RigidBody)body1, (RigidBody)body2, anchor, anchor);
            worldPointConstraint[1] = new FixedPoint((RigidBody)body2, (RigidBody)body1, anchor, anchor);


            StateTracker.AddTracking(worldPointConstraint[0]);
            //StateTracker.AddTracking(worldPointConstraint[1]);

            Activate();
        }
        public CharacterJoint3D(IWorld world, IBody3D body1, IBody3D body2, TSVector position, TSVector hingeAxis) : base((World)world)
        {
            RigidBody rigid1 = (RigidBody)body1;
            RigidBody rigid2 = (RigidBody)body2;

            fixedAngle  = new FixedAngle(rigid1, rigid2);
            pointOnLine = new PointOnLine(rigid1, rigid2, rigid1.position, rigid2.position);

            firstBody            = body1;
            secondBody           = body2;
            hingeA               = hingeAxis;
            worldPointConstraint = new PointOnPoint[2];
            hingeAxis           *= FP.Half;
            TSVector anchor = position;

            TSVector.Add(ref anchor, ref hingeAxis, out anchor);
            TSVector anchor2 = position;

            TSVector.Subtract(ref anchor2, ref hingeAxis, out anchor2);
            worldPointConstraint[0] = new PointOnPoint((RigidBody)body1, (RigidBody)body2, anchor);
            worldPointConstraint[1] = new PointOnPoint((RigidBody)body2, (RigidBody)body1, anchor2);
            StateTracker.AddTracking(worldPointConstraint[0]);
            StateTracker.AddTracking(worldPointConstraint[1]);
            //UnityEngine.CharacterJoint;
            Activate();
        }
    public override void OnSyncedStart()
    {
        thisBody = GetComponent <TSRigidBody>();
        IBody3D body1 = GetComponent <TSCollider>().Body;
        IBody3D body2 = connectedBody.Body;

        Vector3  worldPos   = transform.TransformPoint(anchor);
        TSVector TSworldPos = worldPos.ToTSVector();

        Vector3 worldAxis = transform.TransformDirection(Axis);

        TSWorldAxis = worldAxis.ToTSVector();


        if (useLimits)
        {
            thisJoint = new LimitedHingeJoint(PhysicsWorldManager.instance.GetWorld(), body1, body2, TSworldPos, TSWorldAxis, -Limits.Min, Limits.Max);
        }
        else
        {
            thisJoint = new MyHingeJoint(PhysicsWorldManager.instance.GetWorld(), body1, body2, TSworldPos, TSWorldAxis);
        }

        thisJoint.Activate();
    }
Exemple #4
0
        public override void OnSyncedStart()
        {
            thisBody = GetComponent <TSRigidBody> ();
            IBody3D body1 = GetComponent <TSCollider> ().Body;
            IBody3D body2 = connectedBody.Body;

            thisJoint = new BasicJoint3D(PhysicsWorldManager.instance.GetWorld(), body1, body2, transform.TransformPoint(anchor).ToTSVector(),
                                         transform.TransformPoint(connectedAnchor).ToTSVector());
        }
        private HingeJoint3D(IWorld world, IBody3D body1, IBody3D body2, TSVector position, TSVector hingeAxis) : base((World)world)
        {
            worldPointConstraint = new PointOnPoint[2];

            hingeAxis *= FP.Half;

            TSVector pos1 = position; TSVector.Add(ref pos1, ref hingeAxis, out pos1);
            TSVector pos2 = position; TSVector.Subtract(ref pos2, ref hingeAxis, out pos2);

            worldPointConstraint[0] = new PointOnPoint((RigidBody)body1, (RigidBody)body2, pos1);
            worldPointConstraint[1] = new PointOnPoint((RigidBody)body1, (RigidBody)body2, pos2);

            Activate();
        }
        public MyHingeJoint(IWorld world, IBody3D body1, IBody3D body2, TSVector position, TSVector hingeAxis) : base((World)world)
        {
            firstBody            = body1;
            secondBody           = body2;
            hingeA               = hingeAxis;
            worldPointConstraint = new PointOnPoint[2];
            hingeAxis           *= FP.Half;
            TSVector anchor = position;

            TSVector.Add(ref anchor, ref hingeAxis, out anchor);
            TSVector anchor2 = position;

            TSVector.Subtract(ref anchor2, ref hingeAxis, out anchor2);
            worldPointConstraint[0] = new PointOnPoint((RigidBody)body1, (RigidBody)body2, anchor);
            worldPointConstraint[1] = new PointOnPoint((RigidBody)body1, (RigidBody)body2, anchor2);
            StateTracker.AddTracking(worldPointConstraint[0]);
            StateTracker.AddTracking(worldPointConstraint[1]);
        }
        public override void OnSyncedStart()
        {
            base.OnSyncedStart();

            thisBody = GetComponent <TSRigidBody>();


            IBody3D body1 = GetComponent <TSCollider>().Body;
            IBody3D body2 = connectedBody.Body;

            Vector3  worldPos   = transform.TransformPoint(anchor);
            TSVector TSworldPos = worldPos.ToTSVector();

            Vector3 worldAxis = transform.TransformDirection(Axis);

            TSWorldAxis = worldAxis.ToTSVector();

            thisJoint = new PrismaticJoint3D(PhysicsWorldManager.instance.GetWorld(), body1, body2, minimumDistance, maximumDistance);
        }
Exemple #8
0
        public PrismaticJoint3D(IWorld world, IBody3D body1, IBody3D body2, FP minimumDistance, FP maximumDistance)
            : base((World)world)
        {
            //fixedAngle = new FixedAngle((RigidBody)body1, (RigidBody)body2);
            pointOnLine = new PointOnLine((RigidBody)body1, (RigidBody)body2, ((RigidBody)body1).position, ((RigidBody)body2).position);

            //minDistance = new PointPointDistance((RigidBody)body1, (RigidBody)body2, ((RigidBody)body1).position, ((RigidBody)body2).position);
            //minDistance.Behavior = PointPointDistance.DistanceBehavior.LimitMinimumDistance;
            //minDistance.Distance = minimumDistance;

            //maxDistance = new PointPointDistance((RigidBody)body1, (RigidBody)body2, ((RigidBody)body1).position, ((RigidBody)body2).position);
            //maxDistance.Behavior = PointPointDistance.DistanceBehavior.LimitMaximumDistance;
            //maxDistance.Distance = maximumDistance;

            //StateTracker.AddTracking(fixedAngle);
            StateTracker.AddTracking(pointOnLine);
            //StateTracker.AddTracking(minDistance);
            //StateTracker.AddTracking(maxDistance);

            Activate();
        }
Exemple #9
0
        public LimitHingeJoint3D(IWorld world, IBody3D body1, IBody3D body2, TSVector position, TSVector hingeAxis, FP minLimit, FP maxLimit) : base(world, body1, body2, position, hingeAxis)
        {
            TSVector perpDir = TSVector.up;

            if (TSVector.Dot(perpDir, hingeAxis) > 0.1f)
            {
                perpDir = TSVector.right;
            }

            TSVector sideAxis = TSVector.Cross(hingeAxis, perpDir);

            perpDir = TSVector.Cross(sideAxis, hingeAxis);
            perpDir.Normalize();

            FP len = 15;

            TSVector hingeRelAnchorPos0 = perpDir * len;

            FP       angleToMiddle = FP.Half * (minLimit - maxLimit);
            TSMatrix outMatrix;

            TSMatrix.CreateFromAxisAngle(ref hingeAxis, -angleToMiddle * FP.Deg2Rad, out outMatrix);

            TSVector hingeRelAnchorPos1 = TSVector.Transform(hingeRelAnchorPos0, outMatrix);

            FP hingeHalfAngle  = FP.Half * (minLimit + maxLimit);
            FP allowedDistance = len * 2 * FP.Sin(hingeHalfAngle * FP.Half * FP.Deg2Rad);

            TSVector hingePos = body1.TSPosition;
            TSVector relPos0c = hingePos + hingeRelAnchorPos0;
            TSVector relPos1c = hingePos + hingeRelAnchorPos1;


            distance          = new PointPointDistance((RigidBody)body1, (RigidBody)body2, relPos0c, relPos1c);
            distance.Distance = allowedDistance;
            distance.Behavior = PointPointDistance.DistanceBehavior.LimitMaximumDistance;

            StateTracker.AddTracking(distance);
        }
Exemple #10
0
        public override void OnSyncedStart()
        {
            thisBody = GetComponent <TSRigidBody> ();
            IBody3D body1 = GetComponent <TSCollider> ().Body;
            IBody3D body2 = connectedBody.Body;

            Vector3  worldPos   = transform.TransformPoint(anchor);
            TSVector TSworldPos = worldPos.ToTSVector();

            Vector3 worldAxis = transform.TransformDirection(Axis);

            TSWorldAxis = worldAxis.ToTSVector();

            Debug.Log("Hinge joint");

            //if (useLimits)
            //    thisJoint = new LimitedHingeJoint(PhysicsWorldManager.instance.GetWorld(), body1, body2, TSworldPos, TSWorldAxis, -Limits.Min, Limits.Max);
            //else
            thisJoint = new HingeJoint3D(PhysicsWorldManager.instance.GetWorld(), body1, body2, TSworldPos, TSWorldAxis);

            //charac joint = new CharacterJoint ();
        }
 /// <summary>
 /// Initializes a new instance of the HingeJoint class.
 /// </summary>
 /// <param name="world">The world class where the constraints get added to.</param>
 /// <param name="body1">The first body connected to the second one.</param>
 /// <param name="body2">The second body connected to the first one.</param>
 /// <param name="position">The position in world space where both bodies get connected.</param>
 /// <param name="hingeAxis">The axis if the hinge.</param>
 ///
 public static void Create(IWorld world, IBody3D body1, IBody3D body2, TSVector position, TSVector hingeAxis)
 {
     new HingeJoint3D(world, body1, body2, position, hingeAxis);
 }
 /// <summary>
 /// Initializes a new instance of the HingeJoint class.
 /// </summary>
 /// <param name="world">The world class where the constraints get added to.</param>
 /// <param name="body1">The first body connected to the second one.</param>
 /// <param name="body2">The second body connected to the first one.</param>
 /// <param name="position">The position in world space where both bodies get connected.</param>
 /// <param name="hingeAxis">The axis if the hinge.</param>
 ///
 public static void Create(IWorld world, IBody3D body1, IBody3D body2, TSVector anchorPosition, TSVector anchorPosition2)
 {
     new BasicJoint3D(world, body1, body2, anchorPosition, anchorPosition2);
 }
    public static void TSApplyRelativeTorque(this IBody3D thisBody, TSVector torque)
    {
        TSVector relCord = TSVector.Transform(torque, thisBody.TSOrientation);

        thisBody.TSApplyTorque(relCord);
    }