跳转到内容

Celestia/Celx 脚本/CELX Lua 方法/CEL 命令 rotate

来自维基教科书,开放的书籍,用于开放的世界

rotate { duration <duration> rate <rate> axis <axisvector> }

在 <duration> 秒内使用当前定义的坐标系旋转摄像机。您必须首先使用 select 命令选择一个物体,并且可以根据需要使用 setframe 命令设置坐标系,如果它当前没有定义。

rotate 命令后面必须跟着一个 wait 命令,其 <duration> 等于或大于 rotate 命令的 <duration>。

参数

duration <duration>
执行 rotate 命令的时间长度,以秒为单位。默认值为 1.0 秒。
rate <rate>
旋转摄像机的速度。默认值为 0.0。
正值和负值用于指示旋转方向。
axis <axisvector>
定义要绕其旋转的轴 [ <x> <y> <z> ]。没有默认值。
将 <x> 、 <y> 或 <z> 值设置为 1 表示 ,设置为 0 表示 。您也可以指定多个轴。


CELX 等效项-1

基于 observer:rotate() 方法。

此等效项在 大约 <duration> 秒内旋转观察者,旋转角度为 正好 <duration> * <rate> 度。

  • 查找并选择名称为 <string> 的物体以选择并存储在 "objectname" 中。
objectname = celestia:find( <string> )
celestia:select(objectname)
  • 初始化旋转的 "duration",以秒为单位。
duration = <duration>
  • 计算 "rotationangle",它是 "duration" * <rate> 的乘积,单位为度。<rate> 是每秒的旋转速度,单位为度。必须将 "rotationangle" 转换为弧度,方法是乘以 math.pi (= 3.14159265) 并除以 180。Lua 的 math.rad(rotationangle) 函数也可以用于此目的。
rotationangle = math.rad(duration * <rate> )
  • 为旋转创建轴向量 [ <x> <y> <z> ] 并存储在 "axis_vector" 中。
axis_vector = celestia:newvector( <x> , <y> , <z> )


  • 获取活动视图的观察者实例并存储在 "obs" 中。
obs = celestia:getobserver()
  • 将旋转分成每秒 50 步。
    因子 0.75 是一个估计值,可能取决于计算机的速度。
rotsteps = 50 * duration
rotsteptime = 0.75*duration/rotsteps
  • 创建一个新的旋转物体,该物体在指定轴上进行分割后的旋转角度。
rot = celestia:newrotation(axis_vector, rotationangle/rotsteps)
  • 实际执行旋转。
for i = 1, rotsteps do
   obs:rotate(rot)
   wait(rotsteptime)
end

总结

objectname = celestia:find( <string> )
celestia:select(objectname)
duration = <duration>
rotationangle = math.rad(duration * <rate> )
axis_vector = celestia:newvector( <x> , <y> , <z> )
obs = celestia:getobserver()
rotsteps = 50 * duration
rotsteptime = 0.75*duration/rotsteps
rot = celestia:newrotation(axis_vector, rotationangle/rotsteps)
for i = 1, rotsteps do
   obs:rotate(rot)
   wait(rotsteptime)
end

作为函数总结

function rotate_obs_angle(rottime, rotangle, rotaxis)
   -- Rottime is the duration of the rotation in seconds
   -- Rotangle is the angle to rotate the observer view in radians
   -- Rotaxis is the axis vector (x,y,z) for the rotation
   local obs = celestia:getobserver()
   local rotsteps = 50 * rottime
   local rotsteptime = 0.75*rottime/rotsteps
   local rot = celestia:newrotation(rotaxis, rotangle/rotsteps)
   for i = 1, rotsteps do
      obs:rotate(rot)
      wait(rotsteptime)
   end
end

objectname = celestia:find( <string> )
celestia:select(objectname)
duration = <duration>
rotationangle = math.rad(duration * <rate> )
axis_vector = celestia:newvector( <x> , <y> , <z> )
rotate_obs_angle(duration, rotationangle, axis_vector)


CELX 等效项-2

基于 observer:rotate() 方法。

此等效项在 正好 <duration> 秒内旋转观察者,旋转角度为 大约 <duration> * <rate> 度。

  • 查找并选择名称为 <string> 的物体以选择并存储在 "objectname" 中。
objectname = celestia:find( <string> )
celestia:select(objectname)
  • 初始化旋转的 "duration",以秒为单位。
duration = <duration>
  • 计算 "rotationangle",它是 "duration" * <rate> 的乘积,单位为度。<rate> 是每秒的旋转速度,单位为度。必须将 "rotationangle" 转换为弧度,方法是乘以 math.pi (= 3.14159265) 并除以 180。Lua 的 math.rad(rotationangle) 函数也可以用于此目的。
rotationangle = math.rad(duration * <rate> )
  • 为旋转创建轴向量 [ <x> <y> <z> ] 并存储在 "axis_vector" 中。
axis_vector = celestia:newvector( <x> , <y> , <z> )
  • 获取活动视图的观察者实例并存储在 "obs" 中。
obs = celestia:getobserver()
  • 将旋转分成每秒 50 步。
    因子 0.75 是一个估计值,可能取决于计算机的速度。
rotsteps = 50 * duration
rotsteptime = 0.75*duration/rotsteps
  • 创建一个新的旋转物体,该物体在指定轴上进行分割后的旋转角度。
rot = celestia:newrotation(axis_vector, rotationangle/rotsteps)


  • 获取脚本启动后经过的秒数,并存储在 "t0" 中。
t0= celestia:getscripttime()
  • 实际执行旋转。
while celestia:getscripttime() <= t0 + duration do
   obs:rotate(rot)
   wait(rotsteptime)
end

总结

objectname = celestia:find( <string> )
celestia:select(objectname)
duration = <duration>
rotationangle = math.rad(duration * <rate> )
axis_vector = celestia:newvector( <x> , <y> , <z> )
obs = celestia:getobserver()
rotsteps = 50 * duration
rotsteptime = 0.75*duration/rotsteps
rot = celestia:newrotation(axis_vector, rotationangle/rotsteps)
t0= celestia:getscripttime()
while celestia:getscripttime() <= t0 + duration do
   obs:rotate(rot)
   wait(rotsteptime)
end

作为函数总结

function rotate_obs_time(rottime, rotangle, rotaxis)
   -- Rottime is the duration of the rotation in seconds
   -- Rotangle is the angle to rotate the observer view in radians
   -- Rotaxis is the axis vector (x,y,z) for the rotation
   local obs = celestia:getobserver()
   local rotsteps = 50 * rottime
   local rotsteptime = 0.75*rottime/rotsteps
   local rot = celestia:newrotation(rotaxis, rotangle/rotsteps)
   local t0= celestia:getscripttime()
   while celestia:getscripttime() <= t0 + duration do
      obs:rotate(rot)
      wait(rotsteptime)
   end
end

objectname = celestia:find( <string> )
celestia:select(objectname)
duration = <duration>
rotationangle = math.rad(duration * <rate> )
axis_vector = celestia:newvector( <x> , <y> , <z> )
rotate_obs_time(duration, rotationangle, axis_vector)

示例
以下示例选择、跟踪并居中地球(因此参考系的坐标系设置为黄道),然后将摄像机沿当前选定物体的 Z 轴向右(正速率值)旋转 5 秒。

CEL

select { object "Sol/Earth" }
follow { }
center { }
wait   { duration 1 }
rotate { duration 5 rate 10 axis [0 0 1] }
wait   { duration 5 }

使用 observer:rotate() 方法的 CELX精确角度

earth = celestia:find("Sol/Earth")
celestia:select(earth)
obs = celestia:getobserver()
obs:follow(earth)
obs:center(earth, 1.0)
wait(1.0)
duration = 5.0
rotation_angle = math.rad(duration * 10)
axis_vector = celestia:newvector(0,0,1)
rotsteps = 50 * duration
rotsteptime = 0.75*duration/rotsteps
rot = celestia:newrotation(axis_vector, rotation_angle/rotsteps)
for i = 1, rotsteps do
   obs:rotate(rot)
   wait(rotsteptime)
end

使用 observer:rotate() 方法的 CELX,在函数中,精确角度

function rotate_obs_angle(rottime, rotangle, rotaxis)
   -- Rottime is the duration of the rotation in seconds
   -- Rotangle is the angle to rotate the observer view in radians
   -- Rotaxis is the axis vector (x,y,z) for the rotation
   local obs = celestia:getobserver()
   local rotsteps = 50 * rottime
   local rotsteptime = 0.75*rottime/rotsteps
   local rot = celestia:newrotation(rotaxis, rotangle/rotsteps)
   for i = 1, rotsteps do
      obs:rotate(rot)
      wait(rotsteptime)
   end
end

earth = celestia:find("Sol/Earth")
celestia:select(earth)
obs = celestia:getobserver()
obs:follow(earth)
obs:center(earth, 1.0)
wait(1.0)
duration = 5.0
rotation_angle = math.rad(duration * 10)
axis_vector = celestia:newvector(0,0,1)
rotate_obs_angle(duration, rotation_angle, axis_vector)

使用 observer:rotate() 方法的 CELX精确时间

earth = celestia:find("Sol/Earth")
celestia:select(earth)
obs = celestia:getobserver()
obs:follow(earth)
obs:center(earth, 1.0)
wait(1.0)
duration = 5.0
rotation_angle = math.rad(duration * 10)
axis_vector = celestia:newvector(0,0,1)
rotsteps = 50 * duration
rot = celestia:newrotation(axis_vector, rotation_angle/rotsteps)
rotsteptime = duration/rotsteps
t0= celestia:getscripttime()
while celestia:getscripttime() <= t0 + duration do
   obs:rotate(rot)
   wait(rotsteptime)
end

使用 observer:rotate() 方法的 CELX,在函数中,精确时间

function rotate_obs_time(rottime, rotangle, rotaxis)
   -- Rottime is the duration of the rotation in seconds
   -- Rotangle is the angle to rotate the observer view in radians
   -- Rotaxis is the axis vector (x,y,z) for the rotation
   local obs = celestia:getobserver()
   local rotsteps = 50 * rottime
   local rotsteptime = 0.75*rottime/rotsteps
   local rot = celestia:newrotation(rotaxis, rotangle/rotsteps)
   local t0= celestia:getscripttime()
   while celestia:getscripttime() <= t0 + duration do
      obs:rotate(rot)
      wait(rotsteptime)
   end
end

earth = celestia:find("Sol/Earth")
celestia:select(earth)
obs = celestia:getobserver()
obs:follow(earth)
obs:center(earth, 1.0)
wait(1.0)
duration = 5.0
rotation_angle = math.rad(duration * 10)
axis_vector = celestia:newvector(0,0,1)
rotate_obs_time(duration, rotation_angle, axis_vector)


返回 CEL 命令索引

华夏公益教科书