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)