コード例 #1
0
ファイル: GeoPos.js プロジェクト: chromatical/jsorrery
	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();
	};
コード例 #2
0
ファイル: CameraManager.js プロジェクト: chromatical/jsorrery
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();
}
コード例 #3
0
ファイル: CameraManager.js プロジェクト: chromatical/jsorrery
function onControlsUpdate() {
	if (!getUniverse().isPlaying()) scene.draw();
}
コード例 #4
0
ファイル: CameraManager.js プロジェクト: chromatical/jsorrery
		};

		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;
コード例 #5
0
ファイル: Apollo.js プロジェクト: chromatical/jsorrery
	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;
コード例 #6
0
	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) {