如何将坐标应用到 xcode 的 scenekit 中的 3D 地球模型?
How can I apply coordinates to a 3D earth model in xcode's scenekit?
我在 scenekit 中制作了一个 3D 地球模型,我想根据经度和纬度在这个模型上放置东西,但不知道从哪里开始。
您无需学习复杂的数学知识即可完成此操作。您需要做的就是添加两个额外的辅助节点。
假设地球由 earthNode
表示,其几何形状(球体)位于节点的中心,半径为 100 点。
向其添加一个具有相同中心的子节点,称为 longtudeHandle
,没有任何几何形状。
现在将另一个子节点添加到第一个 latitudeHandle
,没有任何几何图形。
然后将 space 站节点 stationNode
作为子节点添加到 latitudeHandleNode
,但 不是 在中心。沿 X 轴偏移 105 点,使其位于 "the Equator".
上方 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 旋转都根据其父节点坐标系设置。
然后您可以使用
操纵您的电台的 long/lat 位置
longitudeHanlde.eulerAngles
Y 分量 以弧度为单位的经度角
latitudeHanlde.eulerAngles
Z 分量 以弧度为单位的纬度角
应该是这样的
longitudeHandle.eulerAngles = SCNVector3Make(0, LONGITUDE, 0);
latitudeHanlde.eulerAngles = SCNVector3Make(0, 0, LATITUDE);
使用这些嵌套辅助节点的另一个好处是,空间站将始终垂直于其父级的 X 轴和行星表面,而如果您使用复杂的数学将其定位在轨道上并希望实现相同的效果效果变得更加复杂。
或者,您应该能够仅使用一个辅助(定位)节点和您熟悉的任何一个 "rotational" 属性 来实现相同的 3D 定向 space
.eulerAngles // SCNVector3
.rotation // SCNVector4
.orientation // SCNQuaternion
.transform // SCNMatrix4, includes position and scale
但这需要一些数学知识 and/or 使用矩阵或四元数(我还没有花时间学习)。
我在 scenekit 中制作了一个 3D 地球模型,我想根据经度和纬度在这个模型上放置东西,但不知道从哪里开始。
您无需学习复杂的数学知识即可完成此操作。您需要做的就是添加两个额外的辅助节点。
假设地球由 earthNode
表示,其几何形状(球体)位于节点的中心,半径为 100 点。
向其添加一个具有相同中心的子节点,称为 longtudeHandle
,没有任何几何形状。
现在将另一个子节点添加到第一个 latitudeHandle
,没有任何几何图形。
然后将 space 站节点 stationNode
作为子节点添加到 latitudeHandleNode
,但 不是 在中心。沿 X 轴偏移 105 点,使其位于 "the Equator".
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 旋转都根据其父节点坐标系设置。
然后您可以使用
操纵您的电台的 long/lat 位置longitudeHanlde.eulerAngles
Y 分量 以弧度为单位的经度角latitudeHanlde.eulerAngles
Z 分量 以弧度为单位的纬度角
应该是这样的
longitudeHandle.eulerAngles = SCNVector3Make(0, LONGITUDE, 0);
latitudeHanlde.eulerAngles = SCNVector3Make(0, 0, LATITUDE);
使用这些嵌套辅助节点的另一个好处是,空间站将始终垂直于其父级的 X 轴和行星表面,而如果您使用复杂的数学将其定位在轨道上并希望实现相同的效果效果变得更加复杂。
或者,您应该能够仅使用一个辅助(定位)节点和您熟悉的任何一个 "rotational" 属性 来实现相同的 3D 定向 space
.eulerAngles // SCNVector3
.rotation // SCNVector4
.orientation // SCNQuaternion
.transform // SCNMatrix4, includes position and scale
但这需要一些数学知识 and/or 使用矩阵或四元数(我还没有花时间学习)。