gpt4 book ai didi

swift - 获取用于创建 SCNNode 的 SCNSphere 的半径

转载 作者:搜寻专家 更新时间:2023-11-01 06:24:10 25 4
gpt4 key购买 nike

如何返回用于设置 SCNNode 的球体几何体 (SCNSphere) 的半径。我想在一种方法中使用半径,在该方法中我移动一些与父节点相关的子节点。下面的代码失败了,因为生成的节点似乎不知道半径,我不应该将节点传递给方法吗?

我的数组索引也无法说明 Int 不是范围。

我正在尝试从 this 构建一些东西

import UIKit
import SceneKit

class PrimitivesScene: SCNScene {

override init() {
super.init()
self.addSpheres();
}

func addSpheres() {
let sphereGeometry = SCNSphere(radius: 1.0)
sphereGeometry.firstMaterial?.diffuse.contents = UIColor.redColor()
let sphereNode = SCNNode(geometry: sphereGeometry)
self.rootNode.addChildNode(sphereNode)

let secondSphereGeometry = SCNSphere(radius: 0.5)
secondSphereGeometry.firstMaterial?.diffuse.contents = UIColor.greenColor()
let secondSphereNode = SCNNode(geometry: secondSphereGeometry)
secondSphereNode.position = SCNVector3(x: 0, y: 1.25, z: 0.0)

self.rootNode.addChildNode(secondSphereNode)
self.attachChildrenWithAngle(sphereNode, children:[secondSphereNode, sphereNode], angle:20)
}

func attachChildrenWithAngle(parent: SCNNode, children:[SCNNode], angle:Int) {
let parentRadius = parent.geometry.radius //This fails cause geometry does not know radius.

for var index = 0; index < 3; ++index{
children[index].position=SCNVector3(x:Float(index),y:parentRadius+children[index].radius/2, z:0);// fails saying int is not convertible to range.
}


}

required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

最佳答案

radius 的问题是 parent.geometry 返回一个 SCNGeometry 而不是一个 SCNSphere。如果您需要获取 radius,您需要先将 parent.geometry 转换为 SCNSphere。为了安全起见,最好使用一些可选的绑定(bind)和链接来做到这一点:

if let parentRadius = (parent.geometry as? SCNSphere)?.radius {
// use parentRadius here
}

在访问 children 节点上的 radius 时,您还需要这样做。如果你把所有这些放在一起并稍微清理一下,你会得到这样的东西:

func attachChildrenWithAngle(parent: SCNNode, children:[SCNNode], angle:Int) {
if let parentRadius = (parent.geometry as? SCNSphere)?.radius {
for var index = 0; index < 3; ++index{
let child = children[index]
if let childRadius = (child.geometry as? SCNSphere)?.radius {
let radius = parentRadius + childRadius / 2.0
child.position = SCNVector3(x:CGFloat(index), y:radius, z:0.0);
}
}
}
}

请注意,尽管您调用 attachChildrenWithAngle 时包含 2 个 child :

self.attachChildrenWithAngle(sphereNode, children:[secondSphereNode, sphereNode], angle:20)

如果这样做,您将在访问第三个元素时在 for 循环中遇到运行时崩溃。您要么需要在每次调用该函数时传递一个包含 3 个子项的数组,要么更改该 for 循环中的逻辑。

关于swift - 获取用于创建 SCNNode 的 SCNSphere 的半径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26874990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com