【问题标题】:Controlling an object orbiting a sphere控制围绕球体运行的物体
【发布时间】:2015-03-08 10:00:54
【问题描述】:

我想让用户控制一个在静态球体表面上移动的对象。使用两个按钮来顺时针和逆时针旋转物体的方向,因为它像小行星一样不断向前移动。

在场景工具包中,SCNNode 有三个不同的方向属性,我真的不知道从哪里开始。我了解如何执行除围绕球体旋转之外的所有操作。

【问题讨论】:

  • SCNNodeposition 属性不是您要找的吗?
  • 嗯,它需要保持在球体表面,就好像它在绕轨道运行一样,所以我想我可以使用一个公式来计算球体表面的位置。
  • 嗯,我明白了。在下面的回答中,我描述了一个将球坐标转换为直角坐标的公式。希望这会有所帮助!

标签: ios swift scenekit orbital-mechanics


【解决方案1】:

您正在寻找球体表面的参数化。你可以在网上找到这个(但如果你不知道输入搜索的魔法词,这可能会很棘手)。查看MathWorld上的条目。

球体的表面由两个角度变量参数化,分别称为st。请注意,一个变量将从 0 运行到 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 pi,形成一个完整的球体,这个全扫对应于参数@ 987654328@.

如果您通过坐标(s, t) 表示对象的位置,那么在大多数情况下,您可以使用上面的公式安全地转换为直角坐标,而不必担心任一参数的域;但是,如果st 无限制地增长(例如,因为您的物体长时间连续运行),那么为规范化参数付出一点额外的努力可能是值得的。我不确定sincos 对于非常大的输入的行为。

【讨论】:

  • 非常感谢您的深入解答!嗯,所以如果我的对象的方向在 0 到 2 pi 之间的角度,我将如何将其分解为我的组件 s 和 t 以便将其在当前方向上在球体表面上移动一度?另外,如果我希望相机始终沿着从球体中心穿过轨道物体的矢量看,以保持一切居中,是否有一种简单的方法可以做到这一点?
  • 好吧,这是有道理的。并且看到 s 和 t 都被限制在不同的值之间,有没有一种好方法来决定哪个应该充当哪个组件,或者它是任意的?不过谢谢你,非常有帮助!
  • @jctwood:您在三个坐标中的两个坐标中传递给sin 的参数应该是从 0 到 2 pi 的那个。
  • 好的,很好。我将在早上实施,但无论如何你已经解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 2015-04-26
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
相关资源
最近更新 更多