Beispiel #1
0
        public void SphereCast(AGKVector3 rFrom, AGKVector3 rTo, float rRadius, bool rSlide)
        {
            Agk.SetVector3(FromVectorNumber, rFrom.X, rFrom.Y, rFrom.Z);
            Agk.SetVector3(ToVectorNumber, rTo.X, rTo.Y, rTo.Z);
            Agk.SphereCast3DPhysics(ResourceNumber, (int)FromVectorNumber, (int)ToVectorNumber, rRadius);
            HitObjectNumber = (uint)Agk.Get3DPhysicsRayCastObjectHit(ResourceNumber, Agk.Get3DPhysicsRayCastFraction(ResourceNumber));
            if (HitObjectNumber > 0)
            {
                Agk.Get3DPhysicsRayCastContactPosition(ResourceNumber, Agk.Get3DPhysicsRayCastFraction(ResourceNumber), (int)HitVectorNumber);
                HitPosition.X = Agk.GetVector3X(HitVectorNumber);
                HitPosition.Y = Agk.GetVector3Y(HitVectorNumber);
                HitPosition.Z = Agk.GetVector3Z(HitVectorNumber);

                if (!rSlide)
                {
                    return;
                }

                Agk.Get3DPhysicsRayCastNormalVector(ResourceNumber, (int)HitVectorNumber);

                if (Math.Abs(HitNormalVector.Y) > 0.999)
                {
                    SlideVector = new AGKVector3(HitNormalVector.Y, 0.0f, 0.0f);
                }
                else
                {
                    SlideVector = new AGKVector3(-HitNormalVector.Z, 0.0f, HitNormalVector.X).Normalize();
                }
                HitPosition *= SlideVector;
            }
        }
Beispiel #2
0
 public ArcPath(dynamic rObject, float rVelocity, float rTilt, float rPan)
 {
     Owner           = rObject;
     Velocity        = rVelocity;
     Tilt            = rTilt;
     Pan             = rPan; //Pan should be 0 if 2d
     InitialPosition = rObject.Properties.Position;
     StartTime       = App.Timing.Timer;
 }
Beispiel #3
0
 public void RayCast(AGKVector3 rFrom, AGKVector3 rTo)
 {
     Agk.SetVector3(FromVectorNumber, rFrom.X, rFrom.Y, rFrom.Z);
     Agk.SetVector3(ToVectorNumber, rTo.X, rTo.Y, rTo.Z);
     Agk.RayCast3DPhysics(ResourceNumber, (int)FromVectorNumber, (int)ToVectorNumber, 1);
     HitObjectNumber = (uint)Agk.Get3DPhysicsRayCastObjectHit(ResourceNumber, Agk.Get3DPhysicsRayCastFraction(ResourceNumber));
     if (HitObjectNumber > 0)
     {
         Agk.Get3DPhysicsRayCastContactPosition(ResourceNumber, Agk.Get3DPhysicsRayCastFraction(ResourceNumber), (int)HitVectorNumber);
         HitPosition.X = Agk.GetVector3X(HitVectorNumber);
         HitPosition.Y = Agk.GetVector3Y(HitVectorNumber);
         HitPosition.Z = Agk.GetVector3Z(HitVectorNumber);
     }
 }
Beispiel #4
0
        public void Update()
        {
            if (IsActive)
            {
                var ox = MathUtil.ToRadians(OrbitSpeed * Hardware.Mouse.MoveX) * -1.0f; //remove * -1.0f to invert direction
                var oy = MathUtil.ToRadians(OrbitSpeed * Hardware.Mouse.MoveY) * -1.0f;
                var oz = OrbitSpeed * 0.3f * Hardware.Mouse.MoveZ;
                Theta         += ox;
                Phi           += oy;
                Phi            = MathUtil.Clamp(Phi, 0.1f, (float)Math.PI - 0.1f);
                OrbitDistance += oz;
                OrbitDistance  = MathUtil.Clamp(OrbitDistance, 10.0f, 150.0f);
                ApplyToAgk();
            }

            if (Anchor != null)
            {
                var p = MathUtil.ToDegrees(Phi);
                var t = MathUtil.ToDegrees(Theta);
                Position.X = (Anchor.Properties.Position.X + Offset.X) + (OrbitDistance * Agk.Sin(p) * Agk.Cos(t));
                Position.Z = (Anchor.Properties.Position.Z + Offset.Z) + (OrbitDistance * Agk.Sin(p) * Agk.Sin(t));
                Position.Y = (Anchor.Properties.Position.Y + Offset.Y) + (OrbitDistance * Agk.Cos(p));

                /*
                 * var rx = Anchor.Properties.Position.X + (OrbitDistance * Agk.Sin(Phi) * Agk.Cos(Theta));
                 * var rz = Anchor.Properties.Position.Z + (OrbitDistance * Agk.Sin(Phi) * Agk.Sin(Theta));
                 * var ry = Anchor.Properties.Position.Y + (OrbitDistance * Agk.Cos(Phi));
                 * ViewMatrix = AGKMatrix4.LookAt(new AGKVector3(rx, ry, rz), TargetPosition, _up);
                 */
            }
            else
            {
                //LocalRotation.X += Phi;
                //LocalRotation.Y += Theta;
            }

            if (Target != null)
            {
                TargetPosition = Target.Properties.Position;
            }
        }
Beispiel #5
0
        public AGKVector3 GetPosition(uint rTime, uint rPauseTime)
        {
            //get vectored velocity
            var d  = Velocity * Math.Cos(Tilt);
            var vy = Velocity * Math.Sin(Tilt);
            var vx = d * Math.Sin(Pan);
            var vz = d * Math.Cos(Pan);

            //adjust time, using a passed in time allows us to project into the future or rollback to the past if we want
            StartTime += rPauseTime;
            var elapsed = rTime;

            //get position at time
            var relativeMass = Owner.Properties.Mass + (PhysicsConfig.ArcMassRate * elapsed);
            var pos          = new AGKVector3();

            pos.Y = InitialPosition.Y + (vy * elapsed) - (0.5f * PhysicsConfig.ArcAcceleration * elapsed * elapsed) * PhysicsConfig.Gravity * relativeMass;
            pos.X = InitialPosition.X + vx * elapsed * relativeMass;
            pos.Z = InitialPosition.Z + vz * elapsed * relativeMass;
            return(pos);
        }