/// <summary> /// When first time called this method makes orbit clockwise, next time - oposite /// Orbit plane will be unchanged. /// </summary> public void MakeOrbitCircle() { if (attractor) { #if UNITY_EDITOR if (!Application.isPlaying) { FindReferences(); attractor.FindReferences(); Undo.RecordObject(this, "Round orbit"); } #endif var v = CelestialBodyUtils.CalcCircleOrbitVelocity( attractor._position, _position, attractor.mass, mass, orbitData.orbitNormal, simControlRef.gravitationalConstant ); if (relativeVelocity == v) { relativeVelocity = -v; } else { relativeVelocity = v; } orbitData.isDirty = true; } #if UNITY_EDITOR else { Debug.Log("SpaceGravity2D: Can't round orbit. " + name + " has no attractor"); } #endif }
/// <summary> /// Orbit plane will be unchanged. /// </summary> public void MakeOrbitCircle(bool clockwise) { if (attractor) { #if UNITY_EDITOR if (!Application.isPlaying) { FindReferences(); attractor.FindReferences(); Undo.RecordObject(this, "Round orbit"); } #endif var dotProduct = CelestialBodyUtils.DotProduct(orbitData.orbitNormal, simControlRef.eclipticNormal); //sign of this value determines orbit orientation if (Mathd.Abs(orbitData.orbitNormal.sqrMagnitude - 1d) > 0.5d) { orbitData.orbitNormal = simControlRef.eclipticNormal; } var v = CelestialBodyUtils.CalcCircleOrbitVelocity( attractor._position, _position, attractor.mass, mass, orbitData.orbitNormal * ( clockwise && dotProduct >= 0 || !clockwise && dotProduct < 0 ? 1 : -1 ), simControlRef.gravitationalConstant ); if (relativeVelocity != v) { relativeVelocity = v; orbitData.isDirty = true; } } }
public void SetAutoCircleOrbit() { if (AttractorObjectRef != null) { OrbitData.Velocity = CelestialBodyUtils.CalcCircleOrbitVelocity(Vector3d.zero, OrbitData.Position, OrbitData.AttractorMass, 1f, OrbitData.OrbitNormal, OrbitData.GravitationalConstant); OrbitData.CalculateNewOrbitData(); if (VelocityHandleRef != null) { VelocityHandleRef.position = transform.position + (Vector3)OrbitData.Velocity; } } }