Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 控制围绕球体旋转的对象_Ios_Swift_Scenekit_Orbital Mechanics - Fatal编程技术网

Ios 控制围绕球体旋转的对象

Ios 控制围绕球体旋转的对象,ios,swift,scenekit,orbital-mechanics,Ios,Swift,Scenekit,Orbital Mechanics,我想让用户控制在静态球体表面上移动的对象。使用两个按钮顺时针和逆时针旋转对象的方向,因为它像小行星一样不断向前移动 在场景工具包中,SCNNode有三种不同的方向属性,我真的不知道从哪里开始。我了解如何执行所有操作,除了围绕球体旋转 您正在寻找球体表面的参数化。你可以在网上找到这个(但是如果你不知道在搜索中要输入什么神奇的单词,这可能会很棘手)。查看上的条目 球体的表面由两个角度变量参数化,分别称为s和t。请注意,一个变量将从0运行到2pi,另一个变量将仅从0运行到pi。这是一个很容易错过的问题

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


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

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

球体的表面由两个角度变量参数化,分别称为
s
t
。请注意,一个变量将从0运行到2pi,另一个变量将仅从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
参数扫出半个圆后,您可以将该半个圆从0旋转到2π,形成一个完整的球体,该完整扫掠对应于参数
t


如果用坐标
(s,t)
表示对象的位置,则在大多数情况下,可以使用上述公式安全地转换为直角坐标,而不必担心任何参数的域;但是,如果
s
t
无限制地增长(例如,因为对象连续运行很长时间),则可能值得付出额外的努力来规范化参数。我不确定
sin
cos
对于非常大的输入是如何工作的。

SCNNode
position
属性不是你想要的吗?它需要保持在球体的表面上,就像它在绕轨道运行一样,所以我想我可以用一个公式来计算球体表面上的位置。啊,好的,我现在明白了。在我下面的回答中,我描述了一个将球坐标转换为直角坐标的公式。希望这有帮助!非常感谢您的深入回答!嗯,如果物体的方向是0到2π之间的角度,我怎么把它分解成s和t的分量,以便在球体表面的当前方向上移动一度?另外,如果我想让相机始终沿着从球体中心穿过轨道物体的矢量看,以保持所有物体的中心,有没有简单的方法可以做到这一点?好的,这很有意义。考虑到s和t都被限制在不同的值之间,有没有一个好的方法来决定哪个应该作为哪个分量,或者是任意的?谢谢你,非常有帮助@jctwood:在三个坐标中的两个坐标中传递给sin的参数应该是从0到2pi的参数。好的,很好。我会在早上实施,但你已经解决了我头脑中的问题!