创建SCNNode的子类

时间:2015-07-30 09:39:23

标签: swift scenekit

我使用以下代码从.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")
    }
}

我如何"链接"这个子类到我使用newNode()获得的节点?我天真地认为使用像

这样的东西
let ellipsoid = newNode() as! Ellipsoid

会奏效,但事实并非如此。 感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:0)

好吧,你的代码无法正常工作。

newNode中,您可以创建SCNNode

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

稍后你告诉编译器这个SCNNodeEllipsoid

let ellipsoid = newNode() as! Ellipsoid

但它不是!这是一个SCNNode。当然你的程序会崩溃。

如果您想要Ellipsoid创建一个:

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

(或者您需要创建它的地方)