Celestia/Celx 指令碼/CELX Lua 方法/CEL 命令 move
外觀
move { duration <duration> velocity <vector> }
以指定的 <vector> 速度(單位為 km/秒)移動相機,分別針對 X、Y 和 Z 軸,持續時間為指定的 <duration> 秒。
在 move 命令之後不需要 wait 命令。
引數
- duration <duration>
- 移動所花費的秒數。無預設值。
- velocity <vector>
- 速度,根據當前活動座標系定義,以 km/秒為單位,分別針對 X、Y 和 Z 軸,以向量形式表示 [ < xspeed > < yspeed > < zspeed > ]。無預設值。
正負 <vector> 值分別用於表示前進和後退(正值不需要“+”號)。
CELX 等價項
基於 observer:goto(table) 方法。
注意: observer:goto(table) 方法中給定的位置應相對於宇宙參考系,而基於非表的 goto 使用相對於當前參考系的位置。
- 在 CELX 中,位置以百萬分之一光年為單位儲存,因此您需要使用“uly_to_km”常量將公里轉換為百萬分之一光年。
uly_to_km = 9460730.4725808
- 獲取活動檢視的觀察者例項並存儲在“obs”中。
obs = celestia:getobserver()
- 確定實際的觀察者位置並存儲在“frompos”中。
frompos = obs:getposition()
- 確定要前往的位置,如下所示:
- 將向量 [ <xspeed> <yspeed> <zspeed> ] 轉換為百萬分之一光年並存儲在“velocityvector”中。
- 將“velocityvector”乘以 <duration> 秒並將結果新增到實際的伺服器位置。結果必須儲存在“topos”中。
velocityvector = celestia:newvector( <xspeed>/uly_to_km, <yspeed>/uly_to_km, <zspeed>/uly_to_km) topos = frompos + <duration> * velocityvector
- 定義並初始化引數表,如下所示:
- 確定 goto 所需的秒數。
- 獲取觀察者的當前位置 = frompos(在 2 步之前獲取)。
- 新位置物件 = topos(在上一步中獲取)。
- 獲取觀察者的當前方向。
- 由於 CEL: move 不會更改觀察者方向,因此最終方向與初始方向相同。
- 從 goto 時間的 0% 開始調整觀察者方向(方向相同)。
- 從 goto 時間的 0% 結束調整觀察者方向(方向相同)。
- 將 10% 的時間用於加速和減速。
parameters={}
parameters.duration = <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
- 將觀察者移動 <duration> 秒,朝目標位置移動。
obs:goto(parameters)
- 等待 <duration> 秒。
wait(parameters.duration)
總結
uly_to_km = 9460730.4725808
obs = celestia:getobserver()
frompos = obs:getposition()
velocityvector = celestia:newvector( <xspeed>/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)
總結為函式
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> )
示例
此示例選擇地球並將相機定位在美國華盛頓州西雅圖上空。
然後將相機移動 10 秒,如下所示:
- 沿著 X 軸,速度為 1000 km/秒。
- 沿著 Y 軸,速度為 2000 km/秒。
- 沿著 Z 軸,速度為 1500 km/秒。
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 使用 observer:goto(table) 方法
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 使用 observer:goto(table) 方法在函式中
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)