this.update = () => { const time = getUniverse().currentTime; if (lng === lastLng && lat === lastLat && time === lastTime) return; // console.log(lng, lat); lastLat = lat; lastLng = lng; lastTime = time; const parsedLat = Number(lat) * DEG_TO_RAD; const parsedLng = (((Number(lng) - 180) * DEG_TO_RAD + body3d.celestial.getCurrentRotation()) % CIRCLE); // console.log(parsedLng); const a = new Euler( parsedLat, 0, parsedLng, 'ZYX' ); const pos = new Vector3( 0, body3d.getPlanetSize(), 0 ); pos.applyEuler(a); pos.applyEuler(body3d.celestial.getTilt()); if (sphere) sphere.position.copy(pos.clone().multiplyScalar(1.01)); target.position.copy(pos); getUniverse().requestDraw(); };
function toggleCamera() { viewSettings.lookFrom = trackOptionSelectors.from.getValue(); viewSettings.lookAt = trackOptionSelectors.at.getValue(); disableControls(); //deactivate geopos GUI if (currentCamera && currentCamera.geoPos) currentCamera.geoPos.deactivate(); //reset all bodies to use fastest position computation setPrecision(false); const lookFromBody = bodies3d[viewSettings.lookFrom]; const lookAtBody = bodies3d[viewSettings.lookAt]; TracerManager.setTraceFrom(); if (lookFromBody) { currentCamera = lookFromBody.getCamera(POV_CAMERA_TYPE); domEl.on('mousewheel', onMouseWheel); //when looking from a body, we need max precision as a minor change in position changes the expected output (e.g. a bodie's position against the stars) setPrecision(true); //if we look from a body to another, trace the lookat body's path relative to the pov UNLESS the look target is orbiting to the pov if (lookAtBody && !lookAtBody.celestial.isOrbitAround(lookFromBody.celestial)) { TracerManager.setTraceFrom(lookFromBody, lookAtBody); } if (currentCamera.geoPos) currentCamera.geoPos.activate(); getUniverse().repositionBodies(); } else { domEl.off('mousewheel'); //if we want to look from an orbital camera, check if it is to look at a particular body or to the whole system if (viewSettings.lookFrom === ORBITAL_CAMERA_TYPE) { currentCamera = (lookAtBody && lookAtBody.getCamera(ORBITAL_CAMERA_TYPE)) || globalCamera; if (currentCamera.jsorrery && currentCamera.jsorrery.controls) currentCamera.jsorrery.controls.enabled = true; } } trackOptionSelectors.at.toggleOptions([...toggling_at_options, viewSettings.lookAt], !!lookFromBody); ExportValues.setCamera(currentCamera); //we show/hide orbits and ecliptics depending on what bodies are of interest OrbitLinesManager.onCameraChange(lookFromBody, lookAtBody); updateCamera(); // scene.draw(); getUniverse().requestDraw(); }
function onControlsUpdate() { if (!getUniverse().isPlaying()) scene.draw(); }
}; globalCamera = getNewCamera(true); globalCamera.position.set(0, -1, getDistanceFromFov(stageSize, globalCamera.fov)); scene.root.add(globalCamera); trackOptionSelectors = { from: Gui.addDropdown(LOOKFROM_ID, toggleCamera), at: Gui.addDropdown(LOOKAT_ID, toggleCamera), }; trackOptionSelectors.from.addOption('Free camera', 'orbital'); trackOptionSelectors.at.addOption('System', 'universe'); if (getUniverse().getBody().name === 'sun') { trackOptionSelectors.at.addOption('Night (away from the sun)', 'night'); } trackOptionSelectors.at.addOption('Direction of velocity', 'front'); trackOptionSelectors.at.addOption('Inverse direction of velocity', 'back'); }, putDefaults(settings) { // console.log(settings); if (settings) { //if geoposition of cam, the gui will force initial settings if (!currentCamera.geoPos) { currentCamera.position.x = Number(settings.x) || 0; currentCamera.position.y = Number(settings.y) || 0;
logForces: true, }; const apolloTLI = Object.assign( {}, apolloBase, { customInitialize() { this.data = {}; }, customAfterTick(elapsedTime, absoluteDate, deltaT) { let dist; if (!this.data.isOnReturnTrip) { if (!this.data.hasTLILabel && this.relativePosition.x !== 0) { Labels.addEventLabel('Trans Lunar Injection', this.relativePosition.clone(), getUniverse().getBody(this.relativeTo)); this.data.hasTLILabel = true; } dist = (Math.abs(this.position.clone().sub(getUniverse().getBody('moon').position).length()) / 1000) - getUniverse().getBody('moon').radius; let moonSpeed = 0; if (this.data.lastMoonDist) { moonSpeed = ((this.data.lastMoonDist - dist) / deltaT) * 1000; } if (!this.data.minMoonDist || dist < this.data.minMoonDist) { this.data.minMoonDist = dist; } else if (this.data.lastMoonDist === this.data.minMoonDist) { Labels.addEventLabel('Closest distance to<br>the Moon: ' + Math.round(this.data.minMoonDist) + ' km', this.previousRelativePosition.clone(), getUniverse().getBody(this.relativeTo)); this.data.isOnReturnTrip = true;
return (x) => { const s = e * sinh(x); const c = e * cosh(x); const f = x - s - M; const f1 = c - 1; const f2 = s; return x + (-5 * f / (f1 + sign(f1) * Math.sqrt(Math.abs(16 * f1 * f1 - 20 * f * f2)))); }; } export default { setDefaultOrbit(orbitalElements, calculator, positionCalculator) { this.orbitalElements = orbitalElements; if (orbitalElements && orbitalElements.epoch) { this.epochCorrection = getUniverse().getEpochTime(orbitalElements.epoch); } this.calculator = calculator; this.positionCalculator = positionCalculator; }, setName(name) { this.name = name; }, calculateVelocity(timeEpoch, relativeTo) { if (!this.orbitalElements) return new Vector3(0, 0, 0); let eclipticVelocity; if (!relativeTo) {