Celestia/Celx 脚本/CELX Lua 方法/CEL 命令 goto
外观
goto { time <duration> distance <radiusdistance> upframe <upframestring> up <upvector> }
将摄像机移动到当前选定的对象,花费 <duration> 秒,距离对象 <radiusdistance> 个单位的半径加 1(以对象的半径为单位),使用 <upframestring> 坐标系,并将 <upvector> 轴定义为指向向上。
参数
- time <duration>
- 移动到目标对象所花的时间(以秒为单位)。默认值为 1.0 秒。
- distance <radiusdistance>
- 描述与对象之间的距离,以对象的半径加 1 为单位。默认值为 5.0。
特殊 <radiusdistance> 值为- 0(零)是对象的中心。在 1.3.1 版本中,使用此值会导致程序错误地识别更远的定位值,因此不要使用零。
- 1 是对象的表面。移动到对象的精确表面水平可能会导致某些显卡在显示屏上显示随机多边形,因此最好使用略高于表面的值。
- upframe <upframestring>
- 设置指定的坐标系。默认值为“observer”。<upframestring> 必须具有以下值之一:
- chase
- ecliptical
- equatorial
- geographic
- lock
- observer
- universal
- up <upvector>
- 定义哪个轴指向向上,X [1 0 0],Y [0 1 0] 或 Z [0 0 1]。默认值为 [0 1 0]。
CELX 等效-1
基于 observer:gotodistance() 方法。
- 找到并选择名为 <string> 的目标对象以移动并存储在“objectname”中。
objectname = celestia:find( <string> ) celestia:select(objectname)
- 获取活动视图实例的观察者实例,并将参考帧的坐标系设置为 <upframestring>。
obs = celestia:getobserver() frame = celestia:newframe( <upframestring>, objectname) obs:setframe(frame)
- 确定“objectname”的半径并存储在“radius”中。
radius = objectname:radius()
- 确定 <distance> 为:<radiusdistance> * “objectname” 的“radius”。
distance = <radiusdistance> * radius
- 定义一个向量对象,以确定哪个轴指向向上。
upaxis = celestia:newvector( <upvector> )
- 以 <duration> 秒的速度移动到确定好的“objectname”的 <distance>,向上指向 <upvector>。
- <distance> 是从目标中心到停止点的距离(以公里为单位)。
- 如果没有提供 <distance>,则默认距离 = 20000 公里。
- 如果 <distance> 小于对象的半径,则 goto 将在对象内结束 !!!
- 要获取对象的半径(以公里为单位),可以使用 object:radius() 方法。
- <duration> 是 goto 所需的时间(以秒为单位)。
- 如果没有提供 <duration>,则默认时间 = 5.0 秒 !!!
- 如果没有提供 <upvector> = upaxis,则默认值为 (0,1,0) --> Y 轴。
- <distance> 是从目标中心到停止点的距离(以公里为单位)。
obs:gotodistance(objectname, distance, <duration>, upaxis )
- 等待 <duration> 秒。
wait( <duration> )
总结
objectname = celestia:find( <string> ) celestia:select(objectname) obs = celestia:getobserver() frame = celestia:newframe( <upframestring>, objectname) obs:setframe(frame) radius = objectname:radius() distance = <radiusdistance> * radius upaxis = celestia:newvector( <upvector> ) obs:gotodistance(objectname, distance, <duration>, upaxis ) wait( <duration> )
CELX 等效-2
基于 observer:goto(table) 方法。
使用此方法,可以执行多种不同类型的 goto。此方法的优势在于可以对观察者方向进行编程,因此也可以确定 goto 后指向的轴。
此方法使用位置进行 goto,而不是对象的距离,因此需要一些额外的计算。goto 的参数必须在表中给出
- parameters.duration: 持续时间(数字)
- parameters.from: 源位置
- parameters.to: 目标位置
- parameters.initialOrientation: 源方向
- parameters.finalOrientation: 目标方向
- parameters.startInterpolation
- parameters.endInterpolation
- parameters.accelTime
- 找到并选择名为 <string> 的目标对象以移动并存储在“objectname”中。
objectname = celestia:find( <string> ) celestia:select(objectname)
- 获取活动视图实例的观察者实例,并将参考帧的坐标系设置为 <upframestring>。
obs = celestia:getobserver() frame = celestia:newframe( <upframestring>, objectname) obs:setframe(frame)
- 确定“objectname”的半径并存储在“radius”中。
radius = objectname:radius()
- 确定以公里为单位的 goto 距离,为:<radiusdistance> * “radius”,并将结果存储在“distance”中。
distance = <radiusdistance> * radius
- 将确定的“distance”转换为“objectname”中的位置,如下所示
uly_to_km = 9460730.4725808 –- Determine and store the current observer position frompos = obs:getposition() –- Determine and store the current position of objectname objectpos = objectname:getposition() –- Determine the vector between the current observer -- position and the current position of objectname distancevec = frompos:vectorto(objectpos) -– Determine the length of this vector in millionths of a light-year. distancelength = distancevec:length() –- Normalize this length to 1 normalvec = distancevec:normalize() –- Distance to travel = (distancelength - distance /uly_to_km) –- Direction to travel = normalvec travelvec = (distancelength - distance /uly_to_km)*normalvec -– Determine and store the position to goto topos = frompos + travelvec
- 目标观察者方向必须从目标位置“topos”指向“objectname”,以 <upvector> 作为向上向量
upvec = celestia:newvector( <upvector> ) torot = topos:orientationto(objectpos, upvec)
- 定义并初始化参数表,如下所示
- 确定 goto 所需的时间(以秒为单位)。
- 获取观察者的当前位置。
- 新位置对象 = topos(结果来自之前的 2 个步骤)。
- 获取观察者的当前方向。
- 新的观察者方向 = torot(结果来自之前的步骤)。
- 在 goto 时间的 20% 后开始调整观察者方向。
- 在 goto 时间的 80% 后结束调整观察者方向。
- 将 10% 的时间用于加速和减速
parameters={} parameters.duration = <duration> parameters.from = obs:getposition() parameters.to = topos parameters.initialOrientation = obs:getorientation() parameters.finalOrientation = torot parameters.startInterpolation = 0.2 parameters.endInterpolation = 0.8 parameters. accelTime = 0.1
- 以 <duration> 秒的速度移动到目标位置,目标方向为 <duration> 秒。
obs:goto(parameters)
- 等待 <duration> 秒。
wait(parameters.duration)
总结
objectname = celestia:find( <string> ) celestia:select(objectname) obs = celestia:getobserver() frame = celestia:newframe( <upframestring>, objectname) obs:setframe(frame) radius = objectname:radius() distance = <radiusdistance> * radius uly_to_km = 9460730.4725808 –- Determine and store the current observer position frompos = obs:getposition() –- Determine and store the current position of objectname objectpos = objectname:getposition() –- Determine the vector between the current observer -- position and the current position of objectname distancevec = frompos:vectorto(objectpos) -– Determine the length of this vector in millionths of a light-year. distancelength = distancevec:length() –- Normalize this length to 1 normalvec = distancevec:normalize() –- Distance to travel = (distancelength - distance /uly_to_km) –- Direction to travel = normalvec travelvec = (distancelength - distance /uly_to_km)*normalvec -– Determine and store the position to goto topos = frompos + travelvec upvec = celestia:newvector( <upvector> ) torot = topos:orientationto(objectpos, upvec) parameters={} parameters.duration = <duration> parameters.from = obs:getposition() parameters.to = topos parameters.initialOrientation = obs:getorientation() parameters.finalOrientation = torot parameters.startInterpolation = 0.2 parameters.endInterpolation = 0.8 parameters. accelTime = 0.1 obs:goto(parameters) wait(parameters.duration)
例子
以下示例选择火星,并花费 5 秒的时间移动到火星表面以上 10 倍半径的位置,Y 轴指向向上。
CEL
select { object "Mars" } goto { time 5.0 distance 11.0 upframe "ecliptic" up [0 1 0] } print { text "We're on our way to Mars." row -3 column 1 duration 5 } wait { duration 5 }
CELX-1,使用 observer:gotodistance() 方法
mars = celestia:find("Sol/Mars") celestia:select(mars) frame = celestia:newframe("ecliptic", mars) obs = celestia:getobserver() obs:setframe(frame) marsradius = mars:radius() marsdistance = 11 * marsradius upaxis = celestia:newvector(0,1,0) obs:gotodistance(mars, marsdistance, 5.0, upaxis) celestia:print("We're on our way to Mars." , 5.0, -1, -1, 1, 3) wait(5.0)
CELX-2,使用 observer:goto(table) 方法
mars = celestia:find("Sol/Mars") celestia:select(mars) frame = celestia:newframe("ecliptic", mars) obs = celestia:getobserver() obs:setframe(frame) marsradius = mars:radius() distance = 11 * marsradius uly_to_km = 9460730.4725808 frompos = obs:getposition() objectpos = mars:getposition() distancevec = frompos:vectorto(objectpos) distancelength = distancevec:length() normalvec = distancevec:normalize() travelvec = (distancelength - distance /uly_to_km)*normalvec topos = frompos + travelvec upvec = celestia:newvector(0,1,0) torot = topos:orientationto(objectpos, upvec) parameters={} parameters.duration = 5.0 parameters.from = obs:getposition() parameters.to = topos parameters.initialOrientation = obs:getorientation() parameters.finalOrientation = torot parameters.startInterpolation = 0.2 parameters.endInterpolation = 0.8 parameters. accelTime = 0.1 obs:goto(parameters) celestia:print("We're on our way to Mars." , 5.0, -1, -1, 1, 3) wait(parameters.duration)