我在scenekit中制作了一个3D地球模型,我想根据经度和纬度把东西放在这个模型上,并且不知道从哪里开始。
答案 0 :(得分:1)
您无需进行复杂的数学运算即可。您需要做的就是添加两个额外的辅助节点。
让我们假设地球由earthNode
表示,其几何(球体)位于节点的中心,半径为100点。
使用名为longtudeHandle
的同一中心向其添加子节点,不带任何几何体。
现在将另一个子节点添加到第一个latitudeHandle
,没有任何几何体。
然后,您将空间站节点stationNode
作为子项添加到latitudeHandleNode
,但不位于中心。沿着X轴偏移,比如105点,将它放在“赤道”上方5点。
SCNNode * longtudeHandle = [SCNNode node];
[earthNode addChildNode:longtudeHandle];
SCNNode * latitudeHandle = [SCNNode node];
[longtudeHandle addChildNode:latitudeHandle];
stationNode.position = SCNVector3Make(105, 0, 0);
[latitudeHandle addChildNode:stationNode];
您应该在场景中使用以下节点图
earthNode
|
|--------longitudeHandle
|
|----------latitudeHandle
|
|-----------stationNode
因此,您有4个嵌套坐标系,每个节点根据其父节点坐标系设置3D旋转。
然后,您可以使用
操纵电台的长/纬度位置longitudeHanlde.eulerAngles
Y分量,以弧度为单位的经度角度latitudeHanlde.eulerAngles
Z分量,以弧度为单位的纬度角度应该看起来像
longitudeHandle.eulerAngles = SCNVector3Make(0, LONGITUDE, 0);
latitudeHanlde.eulerAngles = SCNVector3Make(0, 0, LATITUDE);
使用这些嵌套辅助节点的另一个好处是,工作站将始终垂直于其父级的X轴和行星表面,而如果使用复杂的数学运算将其定位在轨道上并希望实现相同的效果变得更加复杂。
或者,您应该能够只使用一个辅助(定位)节点和您熟悉的任何“旋转”属性来对其进行3D空间定位
.eulerAngles // SCNVector3
.rotation // SCNVector4
.orientation // SCNQuaternion
.transform // SCNMatrix4, includes position and scale
但这需要一些数学和/或使用矩阵或四元数(我还没有花时间学习)。