Something went wrong. Try again.
Starship Simulator Controls thoriumsim.com
Something went wrong. Try again.
1.7 kB · 61 lines
TypeScript
at develop
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162import type { Entity } from "@thorium/utils/ecs";import { Vector3 } from "three";
import { degToRad } from "../unitTypes";
const axis = new Vector3(0, 0, 1);
export function getOrbitPosition({ semiMajorAxis, eccentricity, orbitalArc, inclination, origin = new Vector3(),}: OrbitPositionProps) { const radiusY = semiMajorAxis - semiMajorAxis * eccentricity; const X = semiMajorAxis * Math.cos(degToRad(orbitalArc)); const Z = radiusY * Math.sin(degToRad(orbitalArc)); const vec = new Vector3(X, 0, Z); const angle = degToRad(inclination);
vec.applyAxisAngle(axis, angle).add(origin); return vec;}
interface OrbitPositionProps { semiMajorAxis: number; eccentricity: number; orbitalArc: number; inclination: number; origin?: Vector3;}
/** Gets an objects position based on its satellite component, including if it is orbiting another satellite */export function getCompletePositionFromOrbitClient( object: Pick<Entity, "components">, planets: Pick<Entity, "id" | "components">[],) { const origin = new Vector3(0, 0, 0); if (object.components.satellite) { if (object.components.satellite.parentId) { const parent = planets.find((p) => p.id === object.components.satellite?.parentId); if (parent?.components?.satellite) { const parentPosition = getOrbitPosition(parent.components.satellite); origin.copy(parentPosition); } } const position = getOrbitPosition({ ...object.components.satellite, origin, }); return position; } if (object.components.position) { return new Vector3( object.components.position.x, object.components.position.y, object.components.position.z, ); } return new Vector3();}