private void ControlManual() { if (Input.GetKey(KeyCode.A)) { _rightThruster.SetThrottle(1.0f); } else { _rightThruster.SetThrottle(0.0f); } if (Input.GetKey(KeyCode.D)) { _leftThruster.SetThrottle(1.0f); } else { _leftThruster.SetThrottle(0.0f); } if (Input.GetKey(KeyCode.W)) { _centerThruster.SetThrottle(1.0f); } else { _centerThruster.SetThrottle(0.0f); } }
private void NaiveUpdateCancelVerticalVelocity(Vector3 velocity, float heightFromGround, Thruster mainEngine) { if (heightFromGround < 0) { return; } heightFromGround += heightDetectorError; float yVelocity = -velocity.y; float burnDuration = yVelocity / (mainEngine.GetMaxImpulseStrength() + Physics.gravity.y); float timeToGroundHit = heightFromGround / yVelocity; Debug.Log($"Time to ground: {timeToGroundHit} BurnDuration: {burnDuration}"); if (timeToGroundHit < burnDuration) { mainEngine.SetThrottle(1); } else { mainEngine.SetThrottle(0); } if (heightFromGround < 1 && yVelocity < 0) { mainEngine.Shutdown(); } }
private void CompleteUpdateCancelVerticalVelocity(Vector3 velocity, float heightFromGround, Thruster mainEngine) { if (heightFromGround < 0) { return; } // Acceleration is caused by the sum of gravity and the engine strength, so: // h''(t) = g + e; // h'(t) = v0 + gt + et; (Integral from h'') // h(t) = h0 + v0*t + 0.5*g*t*t + 0.5*e*t*t (Integral from h') // where: // h0 = start height // v0 = start vertical velocity // g = gravity // e = main engine impule strength //To solve we need: // Solve for h0 => At what height do we need to start burning to land perfectly? // h(t) = 0 (We have landed) // h'(t) = 0 (We have 0 velocity) //Calculation: // 0 = v0 + gt + et /-v0 // -v0 = gt + et / format // -v0 = (g+e)*t / /(g+e) // -v0/(g+e) = t // so the burn duration (b) is equal to: b == t == -v0/(g+e) //insert into h(t) = 0 // 0 = h0 + v0*b + 0.5*g*b*b + 0.5*e*t*t /-h0 /*-1 // h0 = -v0b -0.5*gbb -0.5*ebb; float correctedHeight = heightFromGround + heightDetectorError; float v0 = velocity.y; float e = mainEngine.GetMaxImpulseStrength() * (1 - engineEnergyLossPercent); //engine seems to not be applying the force 100% so we use a slightly reduced engine impulse float g = Physics.gravity.y; float b = -v0 / (g + e); float h0 = -v0 * b - 0.5f * g * b * b - 0.5f * e * b * b; Debug.Log($"{Time.time} : Height: {heightFromGround} CorrectedHeight: {correctedHeight}, Height to start burn is: {h0}"); //Turn on engine if we should burn, otherwise turn off if (correctedHeight <= h0) { mainEngine.SetThrottle(1); } else { mainEngine.SetThrottle(0); } //if we have landed, shutdown the engine (This is helpfull in case we reach v=0 slighly above the ground if (correctedHeight < 1 && v0 > 0) { mainEngine.Shutdown(); } }
private void UpdateManualControl() { for (int i = 0; i < sideThrusters.Length; i++) { if (Input.GetKey((KeyCode)((int)KeyCode.Alpha0 + i))) { sideThrusters[i].SetThrottle(1); } else { sideThrusters[i].SetThrottle(0); } } if (Input.GetKey(KeyCode.Space)) { mainEngine.SetThrottle(1); } else { mainEngine.SetThrottle(0); } }
public void UGUI_HandleCWThrusterSliderValueChange() { cwThruster.SetThrottle(thrusterCurve.Evaluate(cwThrusterSlider.value)); }