//-------------------------------------------------------------------------------------------------------------- /// <summary> /// Calculates the new thrust value based on the averaged <see cref="AIMContext.DecidedDirection"/>. /// </summary> protected override void CalculateForce() { Vector3 velocity = Body.velocity; Vector3 targetGlobal = Context.DecidedDirection; float deltaAngle = Vector3.Angle(velocity, targetGlobal) * Mathf.Deg2Rad; deltaAngle = Mathf.Clamp(deltaAngle, 0, 1); // calculate up/downward force float thrust = (ThrustFactor * Mathf.Cos(deltaAngle) * targetGlobal.y - velocity.y); angleToUp = Vector3.Angle(transform.up, Vector3.up) * Mathf.Deg2Rad; thrust = thrust / Mathf.Cos(angleToUp); if (UsePidController) { thrust = ThrustController.GetOutput(thrust); } // compensate gravity float nominalThrottle = -Physics.gravity.y * Body.mass; thrust = Mathf.Clamp(thrust, -nominalThrottle / 2, nominalThrottle / 2); thrust = thrust + nominalThrottle / Mathf.Cos(angleToUp); // no downward acceleration if (thrust < 0) { thrust = 0.0f; } force = thrust * transform.up; }
public WaypointFollower(List<Waypoint> waypointsToFollow, IMyShipController shipController, ThrustController oof) { waypoints = waypointsToFollow; controller = shipController; thrustController = oof; currentWaypointIndex = 0; }
WaterfallController CreateNewController() { if (controllerTypes[controllerFlag] == "atmosphere_density") { AtmosphereDensityController newCtrl = new AtmosphereDensityController(); newCtrl.name = newControllerName; newCtrl.linkedTo = controllerTypes[controllerFlag]; return(newCtrl); } else if (controllerTypes[controllerFlag] == "custom") { CustomController newCtrl = new CustomController(); newCtrl.name = newControllerName; newCtrl.linkedTo = controllerTypes[controllerFlag]; return(newCtrl); } else if (controllerTypes[controllerFlag] == "engineEvent") { EngineEventController newCtrl = new EngineEventController(); newCtrl.name = newControllerName; newCtrl.linkedTo = controllerTypes[controllerFlag]; newCtrl.eventName = eventTypes[eventFlag]; newCtrl.eventCurve = eventCurve; newCtrl.eventDuration = eventDuration; return(newCtrl); } else if (controllerTypes[controllerFlag] == "gimbal") { GimbalController newCtrl = new GimbalController(); newCtrl.name = newControllerName; newCtrl.axis = axisTypes[axisFlag]; newCtrl.linkedTo = controllerTypes[controllerFlag]; return(newCtrl); } else if (controllerTypes[controllerFlag] == "light") { LightController newCtrl = new LightController(); newCtrl.name = newControllerName; newCtrl.linkedTo = controllerTypes[controllerFlag]; return(newCtrl); } else if (controllerTypes[controllerFlag] == "mach") { MachController newCtrl = new MachController(); newCtrl.name = newControllerName; newCtrl.linkedTo = controllerTypes[controllerFlag]; return(newCtrl); } else if (controllerTypes[controllerFlag] == "random") { RandomnessController newCtrl = new RandomnessController(); newCtrl.name = newControllerName; newCtrl.range = randomRange; newCtrl.scale = perlinScale; newCtrl.minimum = perlinMin; newCtrl.seed = perlinSeed; newCtrl.speed = perlinSpeed; newCtrl.noiseType = randTypes[randFlag]; newCtrl.linkedTo = controllerTypes[controllerFlag]; return(newCtrl); } else if (controllerTypes[controllerFlag] == "rcs") { RCSController newCtrl = new RCSController(); newCtrl.name = newControllerName; newCtrl.linkedTo = controllerTypes[controllerFlag]; newCtrl.responseRateUp = rampRateUp; newCtrl.responseRateDown = rampRateDown; return(newCtrl); } else if (controllerTypes[controllerFlag] == "throttle") { ThrottleController newCtrl = new ThrottleController(); newCtrl.name = newControllerName; newCtrl.linkedTo = controllerTypes[controllerFlag]; newCtrl.responseRateUp = rampRateUp; newCtrl.responseRateDown = rampRateDown; return(newCtrl); } else if (controllerTypes[controllerFlag] == "thrust") { ThrustController newCtrl = new ThrustController(); newCtrl.name = newControllerName; newCtrl.linkedTo = controllerTypes[controllerFlag]; return(newCtrl); } else { return(null); } }
private void ClearCurrent() { ClearBalanceVisualizer(); foreach (Visual3D visual in _currentVisuals) { _viewport.Children.Remove(visual); } _currentVisuals.Clear(); if (_currentBody != null) { _currentBody.Dispose(); _currentBody = null; } if (_bot != null) { _map.RemoveItem(_bot, true); _bot.Dispose(); _bot = null; } _shipDNA = null; if (_thrustController != null) { _thrustController.Dispose(); _thrustController = null; } }
private async void btnLoadShip_Click(object sender, RoutedEventArgs e) { try { string errMsg; ShipDNA shipDNA = ShipEditorWindow.LoadShip(out errMsg); if (shipDNA == null) { if (!string.IsNullOrEmpty(errMsg)) { MessageBox.Show(errMsg, this.Title, MessageBoxButton.OK, MessageBoxImage.Warning); } return; } EnsureWorldStarted(); ShipCoreArgs core = new ShipCoreArgs() { Map = _map, Material_Ship = _material_Bot, World = _world, }; ShipExtraArgs extra = new ShipExtraArgs() { Options = _editorOptions, ItemOptions = _itemOptions, Material_Projectile = _material_Bot, Radiation = _radiation, Gravity = _gravity, RunNeural = false, RepairPartPositions = chkLoadRepairPositions.IsChecked.Value, }; //Ship ship = await Ship.GetNewShipAsync(shipDNA, _world, _material_Bot, _map, extra); Bot bot = new Bot(BotConstructor.ConstructBot(shipDNA, core, extra)); ClearCurrent(); _shipDNA = shipDNA; _bot = bot; _bot.PhysicsBody.ApplyForceAndTorque += new EventHandler<BodyApplyForceAndTorqueArgs>(Ship_ApplyForceAndTorque); _thrustController = new ThrustController(_bot, _viewport, _itemOptions); if (_bot.Fuel != null) { _bot.Fuel.QuantityCurrent = _bot.Fuel.QuantityMax; } _bot.RecalculateMass(); _thrustController.MassChanged(chkShipSimple.IsChecked.Value); if (chkShipDebugVisuals.IsChecked.Value) { _thrustController.DrawDebugVisuals_Pre(); } _map.AddItem(_bot); grdViewPort.Focus(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
private async void btnShipChallenge2_Click(object sender, RoutedEventArgs e) { try { EnsureWorldStarted(); ClearCurrent(); List<ShipPartDNA> parts = new List<ShipPartDNA>(); parts.Add(new ShipPartDNA() { PartType = FuelTank.PARTTYPE, Position = new Point3D(0.611527511599856, 0, 0.0153375982352619), Orientation = new Quaternion(0, -0.706493084706277, 0, 0.707719945502605), Scale = new Vector3D(4.70545346938791, 4.70545346938791, 1.04748080326409) }); parts.Add(new ThrusterDNA() { PartType = Thruster.PARTTYPE, Position = new Point3D(-1.48216852903668, 0, 0), Orientation = Quaternion.Identity, Scale = new Vector3D(1.65021551755816, 1.65021551755816, 1.65021551755816), ThrusterDirections = ThrusterDesign.GetThrusterDirections(ThrusterType.Two), ThrusterType = ThrusterType.Two }); parts.Add(new ThrusterDNA() { PartType = Thruster.PARTTYPE, Position = new Point3D(-2.60730396412872, 1.18811621237628, -0.0147591913688635), Orientation = new Quaternion(0, 0, -0.846976393198269, 0.531630500784946), Scale = new Vector3D(0.71390056433019, 0.71390056433019, 0.71390056433019), ThrusterDirections = ThrusterDesign.GetThrusterDirections(ThrusterType.Two_Two_One), ThrusterType = ThrusterType.Two_Two_One }); parts.Add(new ThrusterDNA() { PartType = Thruster.PARTTYPE, Position = new Point3D(-2.60721450068017, -1.18828382189838, -0.0147591913688617), Orientation = new Quaternion(0, 0, -0.496864090131338, 0.867828367788216), Scale = new Vector3D(0.71390056433019, 0.71390056433019, 0.71390056433019), ThrusterDirections = ThrusterDesign.GetThrusterDirections(ThrusterType.Two_Two_One), ThrusterType = ThrusterType.Two_Two_One }); ShipDNA shipDNA = ShipDNA.Create(parts); ShipCoreArgs core = new ShipCoreArgs() { Map = _map, Material_Ship = _material_Bot, World = _world, }; ShipExtraArgs extra = new ShipExtraArgs() { Options = _editorOptions, ItemOptions = _itemOptions, Material_Projectile = _material_Bot, Radiation = _radiation, Gravity = _gravity, RunNeural = false, RepairPartPositions = false, }; //Ship ship = await Ship.GetNewShipAsync(shipDNA, _world, _material_Bot, _map, extra); Bot bot = new Bot(BotConstructor.ConstructBot(shipDNA, core, extra)); ClearCurrent(); _shipDNA = shipDNA; _bot = bot; _bot.PhysicsBody.ApplyForceAndTorque += new EventHandler<BodyApplyForceAndTorqueArgs>(Ship_ApplyForceAndTorque); _thrustController = new ThrustController(_bot, _viewport, _itemOptions); //double mass = _ship.PhysicsBody.Mass; _bot.Fuel.QuantityCurrent = _bot.Fuel.QuantityMax; _bot.RecalculateMass(); _thrustController.MassChanged(chkShipSimple.IsChecked.Value); if (chkShipDebugVisuals.IsChecked.Value) { _thrustController.DrawDebugVisuals_Pre(); } //mass = _ship.PhysicsBody.Mass; _map.AddItem(_bot); grdViewPort.Focus(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
private async void btnShipWackyFlyer_Click(object sender, RoutedEventArgs e) { try { EnsureWorldStarted(); ClearCurrent(); List<ShipPartDNA> parts = new List<ShipPartDNA>(); parts.Add(new ShipPartDNA() { PartType = FuelTank.PARTTYPE, Position = new Point3D(0, 0, 0), Orientation = Quaternion.Identity, Scale = new Vector3D(3, 3, 1) }); ThrusterType thrustType = UtilityCore.GetRandomEnum<ThrusterType>(ThrusterType.Custom); parts.Add(new ThrusterDNA() { PartType = Thruster.PARTTYPE, Position = new Point3D(1, 0, 0), Orientation = Math3D.GetRandomRotation(), Scale = new Vector3D(.5d, .5d, .5d), ThrusterDirections = ThrusterDesign.GetThrusterDirections(thrustType), ThrusterType = thrustType }); thrustType = UtilityCore.GetRandomEnum<ThrusterType>(ThrusterType.Custom); parts.Add(new ThrusterDNA() { PartType = Thruster.PARTTYPE, Position = new Point3D(-1, 0, 0), Orientation = Math3D.GetRandomRotation(), Scale = new Vector3D(.5d, .5d, .5d), ThrusterDirections = ThrusterDesign.GetThrusterDirections(thrustType), ThrusterType = thrustType }); thrustType = UtilityCore.GetRandomEnum<ThrusterType>(ThrusterType.Custom); parts.Add(new ThrusterDNA() { PartType = Thruster.PARTTYPE, Position = new Point3D(0, 1, 0), Orientation = Math3D.GetRandomRotation(), Scale = new Vector3D(.5d, .5d, .5d), ThrusterDirections = ThrusterDesign.GetThrusterDirections(thrustType), ThrusterType = thrustType }); thrustType = UtilityCore.GetRandomEnum<ThrusterType>(ThrusterType.Custom); parts.Add(new ThrusterDNA() { PartType = Thruster.PARTTYPE, Position = new Point3D(0, -1, 0), Orientation = Math3D.GetRandomRotation(), Scale = new Vector3D(.5d, .5d, .5d), ThrusterDirections = ThrusterDesign.GetThrusterDirections(thrustType), ThrusterType = thrustType }); ShipDNA shipDNA = ShipDNA.Create(parts); ShipCoreArgs core = new ShipCoreArgs() { Map = _map, Material_Ship = _material_Bot, World = _world, }; ShipExtraArgs extra = new ShipExtraArgs() { Options = _editorOptions, ItemOptions = _itemOptions, Material_Projectile = _material_Bot, Radiation = _radiation, Gravity = _gravity, RunNeural = false, RepairPartPositions = false, }; //Ship ship = await Ship.GetNewShipAsync(shipDNA, _world, _material_Bot, _map, extra); Bot bot = new Bot(BotConstructor.ConstructBot(shipDNA, core, extra)); ClearCurrent(); _shipDNA = shipDNA; _bot = bot; _bot.PhysicsBody.ApplyForceAndTorque += new EventHandler<BodyApplyForceAndTorqueArgs>(Ship_ApplyForceAndTorque); _thrustController = new ThrustController(_bot, _viewport, _itemOptions); //double mass = _ship.PhysicsBody.Mass; _bot.Fuel.QuantityCurrent = _bot.Fuel.QuantityMax; _bot.RecalculateMass(); _thrustController.MassChanged(chkShipSimple.IsChecked.Value); if (chkShipDebugVisuals.IsChecked.Value) { _thrustController.DrawDebugVisuals_Pre(); } //mass = _ship.PhysicsBody.Mass; _map.AddItem(_bot); grdViewPort.Focus(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }