Let's suppose that in your script you need to compress X days into Y seconds. Then you convert these X days to seconds and divide this by Y seconds, obtaining a time factor F, that you can use to increase time speed.
But this "acceleration" is really a jump from 1 to F in zero time, and produces a not so pleasant effect.
The function below, instead, applies a smooth acceleration to time, assuring a much better result (that may be very suitable for certain visual purposes)
The script also includes two use examples.
Code: Select all
--*********************************************************
--*********************************************************
-- accTime()
-- A function to calculate smooth time acceleration
--
-- coded by Toti
--*********************************************************
--*********************************************************
--****************************************************
-- constants (only used by the main program)
--****************************************************
DELAY = 5
--****************************************************
-- the accTime() function
--
-- parameters:
-- DT: real time interval in days
-- dt: simulation time interval in seconds
-- (where DT will be compressed into)
--****************************************************
function accTime (DT, dt)
local st0 = celestia:getscripttime()
local pi = math.pi
local k = ((DT/dt * 43200) - 0.5) * pi -- 43200 * 2 = seconds in a day
local period = pi / dt
local dst = 0 -- without this, 'repeat-until' does not work
repeat
wait()
dst = celestia:getscripttime() - st0
local ts = k * math.sin (dst * period) + 1
celestia:settimescale (ts)
-- you can comment this line:
celestia:flash (string.format("Seconds: %3.0f" , dst), DELAY)
until dst >= dt
celestia:settimescale (1) -- correct floating point error
end
--****************************************************
-- use the function
--****************************************************
upVector = celestia:newvector(0,1,0)
obs = celestia:getobserver()
earth = celestia:find("Sol/Earth")
celestia:select(earth)
obs:gotolonglat(earth, 0, 0, 20000, DELAY)
obs:lookat(earth:getposition(),upVector)
celestia:flash ("Let's show an entire Earth day in ten seconds...", DELAY)
wait(DELAY)
--**************************
--Here is the function call
--**************************
accTime (1, 10)
celestia:flash ("And now...", DELAY)
wait(DELAY)
sol = celestia:find("Sol")
obs:gotolonglat(sol, 0, 1.5707, 4*1e8, DELAY)
obs:lookat(sol:getposition(),upVector)
wait(DELAY)
-- be sure to show planet's orbits and flags
oldrf = celestia:getrenderflags()
oldlf = celestia:getlabelflags()
oldof = celestia:getorbitflags()
celestia:setrenderflags{constellations=false,eclipseshadows=true,galaxies=true,grid=false,lightdelay=false,markers=false,
nightmaps=true,orbits=true,planets=true,ringshadows=true,smoothlines=false,stars=true}
celestia:setlabelflags{asteroids=false,spacecraft=false,comets=false,constellations=false,locations=false,moons=false,
planets=true,star=false}
celestia:setorbitflags{Planet=true,Moon=false,Comet=false,Asteroid=false,Spacecraft=false}
celestia:flash ("...let's watch ten Earth years in twenty seconds...", DELAY)
wait(DELAY)
--**************************
--Here is the function call
--**************************
accTime (365*10, 20)
celestia:flash ("That was all!", DELAY)
wait(DELAY)
-- restore user's defaults
celestia:setrenderflags(oldrf)
celestia:setlabelflags(oldlf)
celestia:setorbitflags(oldof)
Please post suggestions and bugs here.
Bye