Celestia/Celx Scripting/CELX Lua Methods/CEL command move

move
move { duration  velocity  } 

Move the camera at the specified  velocity in km/sec for each of the X, Y and Z axes, for the specified  in seconds. A wait command is not necessary after a move command.

CELX equivalent:

Based on the observer:goto(table) method.

Note: The given positions in the observer:goto(table) method are expected to be relative to the universal frame-of-reference, while the non table-based goto uses positions relative to the current frame-of-reference.


 * In CELX, positions are stored in millionths of a light year, so you have to convert km to millionths of a light year, using the "uly_to_km" constant.

uly_to_km = 9460730.4725808


 * Obtain observer instance of the active view and store in "obs".

obs = celestia:getobserver


 * Determine the actual observer position and store in "frompos":

frompos = obs:getposition


 * Determine the position to goto as follows:
 * Convert vector [    ] to millionths of a light year and store in "velocityvector".
 * Multiply "velocityvector" with  seconds and add the result to the actual server position. The result must be stored in "topos".

velocityvector = celestia:newvector( /uly_to_km, /uly_to_km, /uly_to_km) topos = frompos +  * velocityvector


 * Define and initialize the parameter table as follows:
 * Determine the number of seconds the goto should take.
 * Obtain the current position of the observer = frompos (obtained 2 steps ago).
 * New position object = topos (obtained in previous step))
 * Obtain the current orientation of the observer.
 * Because CEL: move does not change the observer orientation, the final orientation is the same as the initial orientation.
 * Start adjusting the observer orientation after 0 percent of the time to goto (it’s the same orientation)
 * End adjusting the observer orientation after 0 percent of the time to goto (it’s the same orientation).
 * Spend 10% of the time for accelerating and decelerating

parameters={} parameters.duration =  parameters.from = frompos parameters.to = topos parameters.initialOrientation = obs:getorientation orientation.parameters.finalOrientation = parameters.initialOrientation parameters.startInterpolation = 0 parameters.endInterpolation = 0 parameters.accelTime = 0.1


 * Move the observer  seconds towards target position.

obs:goto(parameters)


 * Wait  seconds.

wait(parameters.duration)

Summarized:

uly_to_km = 9460730.4725808 obs = celestia:getobserver frompos = obs:getposition velocityvector = celestia:newvector( /uly_to_km, <yspeed>/uly_to_km, <zspeed>/uly_to_km) topos = frompos + <duration> * velocityvector parameters = { } parameters.duration = <duration> parameters.from = frompos parameters.to = topos parameters.initialOrientation = obs:getorientation parameters.finalOrientation = parameters.initialOrientation parameters.startInterpolation = 0 parameters.endInterpolation = 0 parameters.accelTime = 0.1 obs:goto(parameters) wait(parameters.duration)

Summarized as a function:

function move_obs(time, x, y, z)   local uly_to_km = 9460730.4725808 local obs = celestia:getobserver local parameters = { } parameters.duration = time parameters.from = obs:getposition local vector = celestia:newvector(x/uly_to_km, y/uly_to_km, z/uly_to_km) parameters.to = parameters.from + parameters.duration * vector parameters.initialOrientation = obs:getorientation parameters.finalOrientation = parameters.initialOrientation parameters.startInterpolation = 0 parameters.endInterpolation = 0 parameters.accelTime = 0.1 obs:goto(parameters) wait(time) end move_obs( <duration>, <xspeed>, <yspeed>, <zspeed> )

Example: This example selects the Earth and positions the camera over Seattle, Washington, USA. Then moves the camera for 10 seconds as follows:
 * along the X axis at a speed of 1000 km/second.
 * along the Y axis at a speed of 2000 km/second.
 * along the Z axis at a speed of 1500 km/second.

CEL:

select     { object "Sol/Earth" } synchronous { } gotolonglat { time 5 distance 3 up [0 1 0] longitude -122 latitude 47 } print      { text "Traveling to Seattle, Washington, USA." row -3 column 1 duration 5 } wait       { duration 5 } move       { duration 10  velocity [ 500 1000 750 ] }

CELX with the observer:goto(table) method:

earth = celestia:find("Sol/Earth") celestia:select(earth) obs = celestia:getobserver obs:synchronous(earth) earthradius = earth:radius earthdistance = 3 * earthradius longitude = -122 * math.pi/180 latitude = 47 * math.pi/180 obs:gotolonglat(earth, longitude, latitude, earthdistance, 5.0) celestia:print("Traveling to Seattle, Washington, USA.", 5.0, -1, -1, 1, 3) wait(5.0) uly_to_km = 9460730.4725808 obs = celestia:getobserver frompos = obs:getposition velocityvector = celestia:newvector( 500/uly_to_km, 1000/uly_to_km, 750/uly_to_km) topos = frompos + 10 * velocityvector parameters = { } parameters.duration = 10 parameters.from = frompos parameters.to = topos parameters.initialOrientation = obs:getorientation parameters.finalOrientation = parameters.initialOrientation parameters.startInterpolation = 0 parameters.endInterpolation = 0 parameters.accelTime = 0.1 obs:goto(parameters) wait(parameters.duration) CELX with the observer:goto(table) method in a function:

function move_obs(time, x, y, z)  local obs = celestia:getobserver local uly_to_km = 9460730.4725808 local parameters = { } parameters.duration = time parameters.from = obs:getposition local vector = celestia:newvector(x/uly_to_km, y/uly_to_km, z/uly_to_km) parameters.to = parameters.from + parameters.duration * vector parameters.initialOrientation = obs:getorientation parameters.finalOrientation = parameters.initialOrientation parameters.startInterpolation = 0 parameters.endInterpolation = 0 parameters.accelTime = 0.1 obs:goto(parameters) wait(time) end earth = celestia:find("Sol/Earth") celestia:select(earth) obs = celestia:getobserver obs:synchronous(earth) earthradius = earth:radius earthdistance = 3 * earthradius longitude = -122 * math.pi/180 latitude = 47 * math.pi/180 obs:gotolonglat(earth, longitude, latitude, earthdistance, 5.0) celestia:print("Traveling to Seattle, Washington, USA.", 5.0, -1, -1, 1, 3) wait(5.0) move_obs(10, 500, 1000, 750)

Back to CEL command index