控制绕球体旋转的物体
Controlling an object orbiting a sphere
我想让用户控制在静态球体表面移动的对象。使用两个按钮顺时针和逆时针旋转物体的方向,就像小行星一样不断向前移动。
在场景工具包中,SCNNode 有三种不同的方向属性,我真的不知道从哪里开始。我了解如何执行除围绕球体旋转之外的所有操作。
您正在寻找球体表面的参数化。您可以在线找到它(但如果您不知道为搜索输入的魔术词,这可能会很棘手)。查看 MathWorld.
上的条目
球体的表面由两个角度变量参数化,称之为s
和t
。请注意,一个变量 运行 从零到 2 pi,另一个变量 运行 仅从 0 到 pi。这是一个很容易错过的陷阱。要将这些角度转换为矩形 (x, y, z) 坐标,您可以使用公式:
x = r cos(s) sin(t)
y = r sin(s) sin(t) // Yes it's sin(t) twice, that's not a typo.
z = r cos(t)
我发现以下可视化很有帮助。平面(例如 xy 平面)中的曲线扫过从零到 pi 的角度,旋转半圈,对应于参数 s
。如果设置 t
等于 pi/2,则 sin(t) = 1,那么您可以看到 x 和 y 如何变成圆形截面的标准直角坐标。 s
参数扫完半圈后,就可以把那半圈从零到2圆周率一直旋转,形成一个完整的球体,那个全扫对应参数t
.
如果您用坐标 (s, t)
表示对象的位置,那么在大多数情况下,您可以使用上面的公式安全地转换为直角坐标,而不必担心任何一个参数的域;但是,如果 s
或 t
无限制地增长(例如,因为您的物体长时间连续运行),则可能值得付出额外的努力来规范化参数。我不确定 sin
或 cos
如何处理非常大的输入。
我想让用户控制在静态球体表面移动的对象。使用两个按钮顺时针和逆时针旋转物体的方向,就像小行星一样不断向前移动。
在场景工具包中,SCNNode 有三种不同的方向属性,我真的不知道从哪里开始。我了解如何执行除围绕球体旋转之外的所有操作。
您正在寻找球体表面的参数化。您可以在线找到它(但如果您不知道为搜索输入的魔术词,这可能会很棘手)。查看 MathWorld.
上的条目球体的表面由两个角度变量参数化,称之为s
和t
。请注意,一个变量 运行 从零到 2 pi,另一个变量 运行 仅从 0 到 pi。这是一个很容易错过的陷阱。要将这些角度转换为矩形 (x, y, z) 坐标,您可以使用公式:
x = r cos(s) sin(t)
y = r sin(s) sin(t) // Yes it's sin(t) twice, that's not a typo.
z = r cos(t)
我发现以下可视化很有帮助。平面(例如 xy 平面)中的曲线扫过从零到 pi 的角度,旋转半圈,对应于参数 s
。如果设置 t
等于 pi/2,则 sin(t) = 1,那么您可以看到 x 和 y 如何变成圆形截面的标准直角坐标。 s
参数扫完半圈后,就可以把那半圈从零到2圆周率一直旋转,形成一个完整的球体,那个全扫对应参数t
.
如果您用坐标 (s, t)
表示对象的位置,那么在大多数情况下,您可以使用上面的公式安全地转换为直角坐标,而不必担心任何一个参数的域;但是,如果 s
或 t
无限制地增长(例如,因为您的物体长时间连续运行),则可能值得付出额外的努力来规范化参数。我不确定 sin
或 cos
如何处理非常大的输入。