创建 SCNNode 的子类

Creating a subclass of a SCNNode

我正在使用以下代码从 .dae 文件加载节点:

func newNode() -> SCNNode {
var node = SCNNode()
let scene = SCNScene(named: "circle.dae")
var nodeArray = scene!.rootNode.childNodes

for childNode in nodeArray {
    node.addChildNode(childNode as! SCNNode)
    }
return node
}

我现在想向这个特定节点添加一些属性和方法,这样当我将它加载到场景中时,它会获得一种随机颜色,然后我可以随时修改这种颜色。我对 SCNSphere 的子类(虽然它是一个几何体而不是一个节点)做了类似的事情,使用:

let NumberOfColors: UInt32 = 4

enum EllipsoidColor: Int, Printable {
case Red = 0, Blue, Green, White

var ellipsoidName: String {
    switch self {
    case .Red:
        return "red"
    case .Blue:
        return "blue"
    case .Green:
        return "green"
    case .White:
        return "white"
    }
}

var description: String {
    return self.ellipsoidName
}

static func random() -> EllipsoidColor {
    return EllipsoidColor(rawValue: Int(arc4random_uniform(NumberOfColors - 1)))!
    }
}


class Ellipsoid: SCNNode {

func setMaterialColor(ellipsoidColor: EllipsoidColor) {
    let color: UIColor

    switch ellipsoidColor {
    case .Red:
        color = UIColor.redColor()
    case .Blue:
        color = UIColor.blueColor()
    case .Green:
        color = UIColor.greenColor()
    case .White:
        color = UIColor.whiteColor()
    }

    self.geometry?.firstMaterial!.diffuse.contents = color
}

var color : EllipsoidColor {
    didSet {
        self.setMaterialColor(color)
    }
}

init(color: EllipsoidColor) {
    self.color = color
    super.init()
    self.setMaterialColor(color)
    }

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

我怎样才能 "link" 这个子类到我使用 newNode() 获得的节点?我天真地认为使用

let ellipsoid = newNode() as! Ellipsoid

会起作用,但不会。 感谢您的时间和帮助。

嗯,您的代码无法运行。

newNode 你创建一个 SCNNode:

func newNode() -> SCNNode {
   var node = SCNNode()
   //...
   return node
}

稍后你告诉编译器这个 SCNNode 是一个 Ellipsoid

let ellipsoid = newNode() as! Ellipsoid

但事实并非如此!这是一个SCNNode。你的程序当然会崩溃。

如果你想要 Ellipsoid 创建一个:

func newEllipsoid() -> Ellipsoid {
   var node = Ellipsoid()
   //...
   return node
}

(或任何你需要创建它的地方)