| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- 'use strict';
- var OrbitalElements = require('./OrbitalElements');
- var ns = require('ns');
- var THREE = require('./Three.shim');
- var CelestialBody = {
- init : function() {
- this.reset();
- this.movement = new THREE.Vector3();
- this.invMass = 1 / this.mass;
- this.orbitalElements = Object.create(OrbitalElements);
- this.orbitalElements.setName(this.name);
- this.orbitalElements.setDefaultOrbit(this.orbit, this.orbitCalculator);
- //console.log(this.name, this.position, this.velocity);
- },
- reset : function(){
- this.angle = 0;
- this.force = new THREE.Vector3();
- this.movement = new THREE.Vector3();
- this.previousPosition = null;
- },
- //if epoch start is not j2000, get epoch time from j2000 epoch time
- getEpochTime : function(epochTime) {
- if(this.epoch) {
- epochTime = epochTime - ((this.epoch.getTime() - ns.J2000) / 1000);
- }
- return epochTime;
- },
- setPositionFromDate : function(epochTime, calculateVelocity) {
- epochTime = this.getEpochTime(epochTime);
- this.position = this.isCentral ? new THREE.Vector3() : this.orbitalElements.getPositionFromElements(this.orbitalElements.calculateElements(epochTime));
- this.relativePosition = new THREE.Vector3();
- if(calculateVelocity) {
- this.velocity = this.isCentral ? new THREE.Vector3() : this.orbitalElements.calculateVelocity(epochTime, this.relativeTo, this.calculateFromElements);
- }
- this.positionRelativeTo();
- },
-
- getAngleTo : function(bodyName){
- var ref = require('./SolarSystem').getBody(bodyName);
- if(ref) {
-
- var eclPos = this.position.clone().sub(ref.getPosition()).normalize();
- eclPos.z = 0;
- var angleX = eclPos.angleTo(new THREE.Vector3(1, 0, 0));
- var angleY = eclPos.angleTo(new THREE.Vector3(0, 1, 0));
- //console.log(angleX, angleY);
- var angle = angleX;
- var q = Math.PI / 2;
- if(angleY > q) angle = -angleX;
- return angle;
- }
- return 0;
- },
- positionRelativeTo : function(){
- if(this.relativeTo) {
- var central = require('./SolarSystem').getBody(this.relativeTo);
- if(central && central!==require('./SolarSystem').getBody()/**/) {
- this.position.add(central.position);
- //console.log(this.name+' pos rel to ' + this.relativeTo);
- this.velocity && central.velocity && this.velocity.add(central.velocity);
- }
- }
- },
- calculatePosition : function(t) {
- return this.orbitalElements.calculatePosition(t);
- },
- getPosition : function(){
- return this.position.clone();
- },
- getVelocity : function(){
- return this.velocity && this.velocity.clone();
- },
- //return true/false if this body is orbiting the requested body
- isOrbitAround : function(celestial){
- return celestial.name === this.relativeTo;
- }
- };
- module.exports = CelestialBody;
|