跳转至内容

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 命令索引

华夏公益教科书