Celestia/Celx 脚本/CELX Lua 方法/Celx 旋转
外观
CELX "旋转" 对象在内部是一个四元数,这是数学上描述三维空间旋转的一种方式(例如,它可以转换为旋转矩阵)。旋转也可以用来描述物体或观察者的方向(例如,观察者正在看哪里,以及“向上”的方向)。
在 CELX 脚本中,旋转方法需要用获取的 "旋转" 对象作为前缀,用冒号隔开。
可以使用以下方法获得 "旋转" 对象。
- 使用 celestia:newrotation(轴-角) 方法。
- 使用 celestia:newrotation() 方法。
- 使用 observer:getorientation() 方法。
- 使用 position:orientationto() 方法。
- 使用 frame:to(旋转) 方法。
- 使用 frame:from(旋转) 方法。
- 使用 rotation:slerp() 方法。
- 使用 1.6.0 phase:getorientation() 方法。
本章包含所有可用的旋转方法列表,这些方法可用于 "旋转" 对象。
vector rotation:imag()
将此旋转的 X、Y 和 Z 值作为 "vector" 对象返回。
备注
- CELX "vector" 对象是三维坐标系中具有长度和方向 [X, Y, Z] 的几何对象。
- 可以使用 vector 方法处理 CELX "vector" 对象。 "Vector" 对象也可以在其他方法中使用,这些方法需要 "vector" 对象作为参数。
示例
obs = celestia:getobserver() rot1 = obs:getorientation() vector = rot1:imag()
number rotation:real()
将此旋转的 W 值作为数字返回。
示例
obs = celestia:getobserver() rot1 = obs:getorientation() number = rot1:real()
vector rotation:transform(vector:vec)
通过将旋转应用于该向量来变换 "vector" 对象,并将结果返回到一个新的 "vector" 对象中。
参数
- vec
- 将应用旋转的向量。必须是 "vector" 对象。
备注
- CELX "vector" 对象是三维坐标系中具有长度和方向 [X, Y, Z] 的几何对象。
- 可以使用 vector 方法处理 CELX "vector" 对象。 "Vector" 对象也可以在其他方法中使用,这些方法需要 "vector" 对象作为参数。
示例
转到地球 实际暗面 的位置。
obs = celestia:getobserver() -- Set frame of reference to "universal". obs:setframe(celestia:newframe("universal")) -- Find the Sun and Earth and get their actual positions earth = celestia:find("Sol/Earth") sun = celestia:find("Sol") now = celestia:gettime() earthpos = earth:getposition(now) sunpos = sun:getposition(now) -- Get vector from Earth to the Sun vector1 = earthpos:vectorto(sunpos) -- Transform that vector over a rotation of 180 degrees = math.pi up_v = celestia:newvector(0,1,0) opposite = celestia:newrotation(up_v, math.pi) vector2 = opposite:transform(vector1) -- Adjust the length of the opposite vector vector2 = 0.0003 * vector2 -- Goto new position and center Earth. newpos = earthpos + vector2 obs:goto(newpos, 0.0) wait(0.0) obs:center(earth, 0.0) wait(0.0)
rotation:setaxisangle(vector:vec, number:angle)
设置轴和角度,如向量和角度中定义的此旋转。
参数
- vec
- 描述此旋转 [X,Y,Z] 轴的向量。必须是 "vector" 对象。
- angle
- 此旋转的弧度角。必须是数字。
备注
- CELX 中的角度定义为弧度,而不是度数。180 度(半圆)等于 π 弧度 = 3.14159265 弧度 = math.pi 弧度 (LUA)。您可以将度数转换为弧度,反之亦然,如下所示
- radians = math.rad( number:degrees ) = ( number:degrees / 180 * math.pi) = ( number:degrees / 180 * 3.14159265).
- degrees = math.deg( number:radians ) = ( number:radians * 180 / math.pi) = ( number:radians * 180 / 3.14159265).
- 此方法等效于 celestia:newrotation(轴-角) 方法。只是使用此方法,"旋转" 对象需要先存在,而不是由方法创建。为了获得这样的 "旋转" 对象,可以使用 celestia:newrotation() 方法,或者您可以使用之前在脚本中定义的现有 "旋转" 对象。
示例
将当前观察者视图更改 180 度(就像后视镜)。
obs = celestia:getobserver() -- Create a rotation object from all zero numbers. rot1 = celestia:newrotation(0, 0, 0, 0) -- Define the axis for the rotation as a vector up_vec = celestia:newvector(0, 1, 0) rot1:setaxisangle(up_vec, math.pi) obs:rotate(rot1) wait(0.0)
rotation:rot3 rotation:slerp(rotation:rot2, number:percent)
返回此旋转和另一个 "旋转" 对象 (rot2) 的插值,使用数字表示每个旋转应该使用多少。将结果返回到一个新的 "旋转" 对象 (rot3) 中。
参数
- rot2
- 将用于插值的第二个旋转。必须是 "旋转" 对象。
- percent
- 用于在两个旋转之间进行插值的百分数。必须是 0 到 1 之间的数字。
- 如果 percent 为 0,则在 rotation:rot3 中返回此旋转。
- 如果 percent 为 1,则在 rotation:rot3 中返回第二个旋转 (rot2)。
备注
- CELX "旋转" 对象在内部是一个四元数,这是数学上描述三维空间旋转的一种方式(例如,它可以转换为旋转矩阵)。旋转也可以用来描述物体或观察者的方向(例如,观察者正在看哪里,以及“向上”的方向)。
- 可以使用 旋转 方法处理 CELX "旋转" 对象。 "旋转" 对象也可以在其他方法中使用,这些方法需要 "旋转" 对象作为参数。
示例
转到地月系中的一个位置,并将观察者方向设置为地月位置的中间位置。
obs = celestia:getobserver() -- Set frame of reference to "universal". obs:setframe(celestia:newframe( "universal")) -- Find the actual position of the Earth. earth = celestia:find("Sol/Earth") earthpos = earth:getposition() -- Find the actual position of the Moon. moon = celestia:find("Sol/Earth/Moon") moonpos = moon:getposition() -- Calculate new position to goto newpos = earthpos + 0.5 * (moonpos - earthpos) newpos = newpos + celestia:newvector(0, 0, 0.075) obs:goto(newpos, 0.0) wait(0.0) -- Orientation from this position towards Earth orient_earth = newpos:orientationto(earthpos, celestia:newvector(0, 1, 0)) -- Orientation from this position towards Moon orient_moon = newpos:orientationto(moonpos, celestia:newvector(0, 1, 0)) -- Interpolate new observer orientation (middle) orientation = orient_earth:slerp(orient_moon, 0.5) obs:setorientation(orientation)