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)