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)