跳转到内容

Celestia/Celx 脚本/CELX Lua 方法/Celx 旋转

来自维基教科书,自由的教科书

Celx 脚本: 旋转

[编辑 | 编辑源代码]

CELX "旋转" 对象在内部是一个四元数,这是数学上描述三维空间旋转的一种方式(例如,它可以转换为旋转矩阵)。旋转也可以用来描述物体或观察者的方向(例如,观察者正在看哪里,以及“向上”的方向)。

在 CELX 脚本中,旋转方法需要用获取的 "旋转" 对象作为前缀,用冒号隔开。

可以使用以下方法获得 "旋转" 对象。

本章包含所有可用的旋转方法列表,这些方法可用于 "旋转" 对象。

vector rotation:imag()

将此旋转的 X、Y 和 Z 值作为 "vector" 对象返回。

备注

  1. CELX "vector" 对象是三维坐标系中具有长度和方向 [X, Y, Z] 的几何对象。
  2. 可以使用 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()


返回到 旋转 方法索引。


transform

[编辑 | 编辑源代码]

vector rotation:transform(vector:vec)

通过将旋转应用于该向量来变换 "vector" 对象,并将结果返回到一个新的 "vector" 对象中。

参数

vec
将应用旋转的向量。必须是 "vector" 对象。

备注

  1. CELX "vector" 对象是三维坐标系中具有长度和方向 [X, Y, Z] 的几何对象。
  2. 可以使用 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)


返回到 旋转 方法索引。


setaxisangle

[编辑 | 编辑源代码]

rotation:setaxisangle(vector:vec, number:angle)

设置轴和角度,如向量和角度中定义的此旋转。

参数

vec
描述此旋转 [X,Y,Z] 轴的向量。必须是 "vector" 对象。
angle
此旋转的弧度角。必须是数字。

备注

  1. 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).
  2. 此方法等效于 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)。

备注

  1. CELX "旋转" 对象在内部是一个四元数,这是数学上描述三维空间旋转的一种方式(例如,它可以转换为旋转矩阵)。旋转也可以用来描述物体或观察者的方向(例如,观察者正在看哪里,以及“向上”的方向)。
  2. 可以使用 旋转 方法处理 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)


返回到 旋转 方法索引。


华夏公益教科书