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; } }
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; }
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); } }
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; } }
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); }