diff --git a/src/components/SmorreryScence.vue b/src/components/SmorreryScence.vue index 11e5b75..e03fc55 100644 --- a/src/components/SmorreryScence.vue +++ b/src/components/SmorreryScence.vue @@ -1,16 +1,96 @@ + + diff --git a/src/utils/SpaceScene/SpaceScene.js b/src/utils/SpaceScene/SpaceScene.js index d3d4b92..8942de1 100644 --- a/src/utils/SpaceScene/SpaceScene.js +++ b/src/utils/SpaceScene/SpaceScene.js @@ -76,6 +76,22 @@ class SpaceScene { const resizer = new Resizer(container, camera, renderer); } + setTimeDirect(direct = 1) { + loop.setTimeDirect(direct) + + // 清空路徑 + orbitingObjects.forEach((obj) => { + obj.trace = [] + }) + + } + + clearOrbitingTrace() { + orbitingObjects.forEach((obj) => { + obj.trace = [] + }) + } + render() { // draw a single frame renderer.render(scene, camera); diff --git a/src/utils/SpaceScene/core/loop.js b/src/utils/SpaceScene/core/loop.js index e3f90a6..5f2f5a6 100644 --- a/src/utils/SpaceScene/core/loop.js +++ b/src/utils/SpaceScene/core/loop.js @@ -1,10 +1,12 @@ -// import { Clock } from "three"; -// import { MAX_DATE, MAX_DATE } from "@/utils/SpaceScene/utils/smorrery_const.js"; -import { calculateJulianDateSinceJ2000 } from "@/utils/SpaceScene/utils/calculator.js"; +import { Clock } from "three"; +import { RENDER_TIMES } from "@/utils/SpaceScene/utils/smorrery_const.js"; +import { calculateJulianDateSinceJ2000} from "@/utils/SpaceScene/utils/calculator.js"; // const clock = new Clock(); const MIN_DATE = new Date(1900, 0, 1); const MAX_DATE = new Date(2100, 11, 31); +let fps_timer = 0 +const clock = new Clock(); class Loop { constructor(camera, scene, renderer, timeScale, currentDate, timeDirection) { @@ -22,25 +24,34 @@ class Loop { // tell every animated object to tick forward one frame this.tick(); + // Frames 控制 + let delta_times = clock.getDelta(); + fps_timer = fps_timer + delta_times + // render a frame - this.renderer.render(this.scene, this.camera); + if(fps_timer > RENDER_TIMES) { + this.renderer.render(this.scene, this.camera); + fps_timer = 0 + } }); } + setTimeDirect(direct){ + if(direct === 1) { + this.timeDirection = 1 + }else{ + this.timeDirection = 0 + } + } + stop() { + fps_timer = 0 this.renderer.setAnimationLoop(null); } tick() { - // only call the getDelta function once per frame! - // const delta = clock.getDelta(); - - // console.log( - // `The last frame rendered in ${delta * 1000} milliseconds`, - // ); - const oneFrameInMilliseconds = this.timeScale * 24 * 60 * 60 * 1000; - if (this.timeDirection > 0) { + if (this.timeDirection >= 1) { this.currentDate.setTime(this.currentDate.getTime() + oneFrameInMilliseconds); } else { this.currentDate.setTime(this.currentDate.getTime() - oneFrameInMilliseconds); diff --git a/src/utils/SpaceScene/utils/smorrery_const.js b/src/utils/SpaceScene/utils/smorrery_const.js index fbc51fe..3cce098 100644 --- a/src/utils/SpaceScene/utils/smorrery_const.js +++ b/src/utils/SpaceScene/utils/smorrery_const.js @@ -34,6 +34,9 @@ export const MAX_TRACE_STEPS = 1000 export const radiusScale = 0.5; export const spaceScale = 20; +export const MAX_FPS = 45 +export const RENDER_TIMES = 1/ MAX_FPS + export const SUN_INFO = { name: "Sun", radius: 9,