void LateUpdate() { if (vessel.isActiveVessel && counter < 2) // hack { counter++; camera.CameraActive = false; } else if (vessel.isActiveVessel && FirstPerson) { camera.CameraActive = true; switch (mode) { case CameraMode.GROUND: camera.UpdateCameraGround(); break; case CameraMode.SPACE: camera.UpdateCameraSpace(); break; case CameraMode.LADDER: camera.UpdateCameraLadder(); break; } if (navball == null) { navball = FindObjectOfType <KSP.UI.Screens.Flight.NavBall>(); } System.Diagnostics.Debug.Assert(navball != null, "navball != null"); CelestialBody mainBody = FlightGlobals.currentMainBody; if (mainBody == null || navball == null || navball.navBall == null) // apparently this can happen during vessel switching { return; } Vector3 position = vessel.transform.position; navball.navBall.rotation = Quaternion.Inverse(camera.target_quaternion) * Quaternion.LookRotation( Vector3.ProjectOnPlane( mainBody.position + (mainBody.transform.up * (float)mainBody.Radius) - position, (position - mainBody.position).normalized ).normalized, (position - mainBody.position).normalized); } else { camera.CameraActive = false; } }
void Imgr_fpCameraManager_OnEnterFirstPerson(KerbalEVA eva) { if (navball_ == null) { navball_ = (KSP.UI.Screens.Flight.NavBall)MonoBehaviour.FindObjectOfType(typeof(KSP.UI.Screens.Flight.NavBall)); } //When deboarding a seat, the reference transform is set to the kerbal's part. //If you have not deboarded a seat, it is empty. //This is to make it always consistent. eva.vessel.SetReferenceTransform(eva.part); }
private void LateUpdate() { if (map_renderer_ == null) { map_renderer_ = PlanetariumCamera.Camera.gameObject.AddComponent<RenderingActions>(); map_renderer_.post_render = RenderTrajectories; } if (galaxy_cube_rotator_ == null) { galaxy_cube_rotator_ = ScaledCamera.Instance.galaxyCamera.gameObject .AddComponent<RenderingActions>(); galaxy_cube_rotator_.pre_cull = RotateGalaxyCube; } // Orient the celestial bodies. if (PluginRunning()) { foreach (var body in FlightGlobals.Bodies) { body.scaledBody.transform.rotation = (UnityEngine.QuaternionD)plugin_.CelestialRotation( body.flightGlobalsIndex); } } override_rsas_target_ = false; Vessel active_vessel = FlightGlobals.ActiveVessel; if (active_vessel != null && !FlightGlobals.ActiveVessel.isEVA) { if (navball_ == null) { navball_ = (KSP.UI.Screens.Flight.NavBall)FindObjectOfType( typeof(KSP.UI.Screens.Flight.NavBall)); } var navball_material = navball_.navBall.GetComponent<UnityEngine.Renderer>().material; if (compass_navball_texture_ == null) { compass_navball_texture_ = navball_material.GetTexture("_MainTexture"); } Action<UnityEngine.Texture> set_navball_texture = (texture) => navball_material.SetTexture("_MainTexture", texture); if (navball_changed_) { // Texture the ball. navball_changed_ = false; // TODO(egg): switch over all frame types and have more navball textures // when more frames are available. if (!fix_navball_in_plotting_frame_ || !PluginRunning()) { set_navball_texture(compass_navball_texture_); } else if (plotting_frame_selector_.get().frame_type == ReferenceFrameSelector.FrameType.BODY_CENTRED_NON_ROTATING) { set_navball_texture(inertial_navball_texture_); } else { set_navball_texture(barycentric_navball_texture_); } } // Orient the ball. if (PluginRunning() && fix_navball_in_plotting_frame_) { navball_.navBall.rotation = (UnityEngine.QuaternionD)navball_.attitudeGymbal * // sic. (UnityEngine.QuaternionD)plugin_.NavballOrientation( (XYZ)Planetarium.fetch.Sun.position, (XYZ)(Vector3d)active_vessel.ReferenceTransform.position); } if (PluginRunning() && has_active_vessel_in_space() && plugin_.HasVessel(active_vessel.id.ToString()) && FlightGlobals.speedDisplayMode == FlightGlobals.SpeedDisplayModes.Orbit) { KSP.UI.Screens.Flight.SpeedDisplay speed_display = KSP.UI.Screens.Flight.SpeedDisplay.Instance; if (speed_display?.textTitle != null && speed_display?.textSpeed != null) { speed_display.textTitle.text = plotting_frame_selector_.get().ShortName(); speed_display.textSpeed.text = ((Vector3d)plugin_.VesselVelocity(active_vessel.id.ToString())) .magnitude.ToString("F1") + "m/s"; } // Orient the Frenet trihedron. Vector3d prograde = (Vector3d)plugin_.VesselTangent(active_vessel.id.ToString()); Vector3d radial = (Vector3d)plugin_.VesselNormal(active_vessel.id.ToString()); // Yes, the astrodynamicist's normal is the mathematician's binormal. // Don't ask. Vector3d normal = (Vector3d)plugin_.VesselBinormal(active_vessel.id.ToString()); SetNavballVector(navball_.progradeVector, prograde); SetNavballVector(navball_.radialInVector, radial); SetNavballVector(navball_.normalVector, normal); SetNavballVector(navball_.retrogradeVector, -prograde); SetNavballVector(navball_.radialOutVector, -radial); SetNavballVector(navball_.antiNormalVector, -normal); // Make the autopilot target our Frenet trihedron. if (active_vessel.OnAutopilotUpdate.GetInvocationList()[0] != (Delegate)(FlightInputCallback)OverrideRSASTarget) { Log.Info("Prepending RSAS override"); active_vessel.OnAutopilotUpdate = (FlightInputCallback)Delegate.Combine( new FlightInputCallback(OverrideRSASTarget), active_vessel.OnAutopilotUpdate); } if (active_vessel.Autopilot.Enabled) { override_rsas_target_ = true; switch (active_vessel.Autopilot.Mode) { case VesselAutopilot.AutopilotMode.Prograde: rsas_target_ = prograde; break; case VesselAutopilot.AutopilotMode.Retrograde: rsas_target_ = -prograde; break; case VesselAutopilot.AutopilotMode.RadialIn: rsas_target_ = radial; break; case VesselAutopilot.AutopilotMode.RadialOut: rsas_target_ = -radial; break; case VesselAutopilot.AutopilotMode.Normal: rsas_target_ = normal; break; case VesselAutopilot.AutopilotMode.Antinormal: rsas_target_ = -normal; break; default: override_rsas_target_ = false; break; } } } } }
void evt_OnLateUpdate(object sender, EventArgs none) { if (!imgr.fpCameraManager.isFirstPerson) { return; } if (navball_ == null) { navball_ = (KSP.UI.Screens.Flight.NavBall)MonoBehaviour.FindObjectOfType(typeof(KSP.UI.Screens.Flight.NavBall)); } Vessel activeVessel = FlightGlobals.ActiveVessel; if (activeVessel == null) { return; } CelestialBody currentMainBody = FlightGlobals.currentMainBody; //NOTE: Kerbal parts seem to be facing towards the sky. Quaternion offsetGymbal; Part referencepart = activeVessel.GetReferenceTransformPart(); if ((referencepart == null) || (referencepart == imgr.fpCameraManager.currentfpeva.part)) { offsetGymbal = Quaternion.AngleAxis(90f, Vector3.right); } else { offsetGymbal = Quaternion.Euler(new Vector3(0.0f, 0.0f, 0.0f)); } Quaternion attitudeGymbal = offsetGymbal * Quaternion.Inverse(navball_.target.rotation); Quaternion relativeGymbal = attitudeGymbal * Quaternion.LookRotation(Vector3.ProjectOnPlane((Vector3)(currentMainBody.position + (Vector3d)currentMainBody.transform.up * currentMainBody.Radius - navball_.target.position), (Vector3)(navball_.target.position - currentMainBody.position).normalized).normalized, (Vector3)(navball_.target.position - currentMainBody.position).normalized); navball_.navBall.rotation = relativeGymbal; if (navball_.progradeVector.gameObject.activeSelf) { navball_.progradeVector.gameObject.SetActive(false); } if (navball_.retrogradeVector.gameObject.activeSelf) { navball_.retrogradeVector.gameObject.SetActive(false); } if (navball_.progradeWaypoint.gameObject.activeSelf) { navball_.progradeWaypoint.gameObject.SetActive(false); } if (navball_.retrogradeWaypoint.gameObject.activeSelf) { navball_.retrogradeWaypoint.gameObject.SetActive(false); } if (navball_.radialInVector.gameObject.activeSelf) { navball_.radialInVector.gameObject.SetActive(false); } if (navball_.radialOutVector.gameObject.activeSelf) { navball_.radialOutVector.gameObject.SetActive(false); } if (navball_.normalVector.gameObject.activeSelf) { navball_.normalVector.gameObject.SetActive(false); } if (navball_.antiNormalVector.gameObject.activeSelf) { navball_.antiNormalVector.gameObject.SetActive(false); } Vector3 displayVelocity = Vector3.zero; switch (FlightGlobals.speedDisplayMode) { case FlightGlobals.SpeedDisplayModes.Orbit: displayVelocity = (Vector3)FlightGlobals.ship_obtVelocity; break; case FlightGlobals.SpeedDisplayModes.Surface: displayVelocity = (Vector3)FlightGlobals.ship_srfVelocity; break; case FlightGlobals.SpeedDisplayModes.Target: displayVelocity = (Vector3)FlightGlobals.ship_tgtVelocity; break; } float displaySpeed = displayVelocity.magnitude; if (displaySpeed == 0.0f) { displaySpeed = 1E-06f; } Vector3 displayVelDir = displayVelocity / displaySpeed; navball_.progradeVector.localPosition = attitudeGymbal * displayVelDir * navball_.VectorUnitScale; navball_.progradeVector.gameObject.SetActive((double)displaySpeed > (double)navball_.VectorVelocityThreshold && (double)navball_.progradeVector.transform.localPosition.z >= (double)navball_.VectorUnitCutoff); navball_.retrogradeVector.localPosition = attitudeGymbal * -displayVelDir * navball_.VectorUnitScale; navball_.retrogradeVector.gameObject.SetActive((double)displaySpeed > (double)navball_.VectorVelocityThreshold && (double)navball_.retrogradeVector.transform.localPosition.z > (double)navball_.VectorUnitCutoff); if (FlightGlobals.fetch.vesselTargetDirection != Vector3.zero) { navball_.progradeWaypoint.localPosition = attitudeGymbal * FlightGlobals.fetch.vesselTargetDirection * navball_.VectorUnitScale; } navball_.progradeWaypoint.gameObject.SetActive(FlightGlobals.fetch.vesselTargetTransform != null && (double)navball_.progradeWaypoint.transform.localPosition.z >= (double)navball_.VectorUnitCutoff); if (FlightGlobals.fetch.vesselTargetDirection != Vector3.zero) { navball_.retrogradeWaypoint.localPosition = attitudeGymbal * -FlightGlobals.fetch.vesselTargetDirection * navball_.VectorUnitScale; } navball_.retrogradeWaypoint.gameObject.SetActive(FlightGlobals.fetch.vesselTargetTransform != null && (double)navball_.retrogradeWaypoint.transform.localPosition.z > (double)navball_.VectorUnitCutoff); SetVectorAlphaTint(navball_.progradeVector); SetVectorAlphaTint(navball_.retrogradeVector); SetVectorAlphaTint(navball_.progradeWaypoint); SetVectorAlphaTint(navball_.retrogradeWaypoint); if (activeVessel.orbit != null && activeVessel.orbit.referenceBody != null && FlightGlobals.speedDisplayMode == FlightGlobals.SpeedDisplayModes.Orbit) { Vector3 wCoM = activeVessel.CurrentCoM; Vector3 obtVel = (Vector3)activeVessel.orbit.GetVel(); Vector3 cbPos = (Vector3)activeVessel.mainBody.position; Vector3 radial = Vector3.ProjectOnPlane((wCoM - cbPos).normalized, obtVel).normalized; Vector3 normal = Vector3.Cross(radial, obtVel.normalized); radial = attitudeGymbal * radial * navball_.VectorUnitScale; normal = attitudeGymbal * normal * navball_.VectorUnitScale; navball_.antiNormalVector.localPosition = normal; navball_.normalVector.localPosition = -normal; navball_.antiNormalVector.gameObject.SetActive((double)normal.z > (double)navball_.VectorUnitCutoff); navball_.normalVector.gameObject.SetActive((double)normal.z < -(double)navball_.VectorUnitCutoff); SetVectorAlphaTint(navball_.antiNormalVector); SetVectorAlphaTint(navball_.normalVector); navball_.radialInVector.localPosition = -radial; navball_.radialOutVector.localPosition = radial; navball_.radialInVector.gameObject.SetActive((double)radial.z < -(double)navball_.VectorUnitCutoff); navball_.radialOutVector.gameObject.SetActive((double)radial.z > (double)navball_.VectorUnitCutoff); SetVectorAlphaTint(navball_.radialInVector); SetVectorAlphaTint(navball_.radialOutVector); } navball_.headingText.text = Quaternion.Inverse(relativeGymbal).eulerAngles.y.ToString("000") + "°"; }