跳轉至內容

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)


返回 CEL 命令索引

華夏公益教科書