创建 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
}
(或任何你需要创建它的地方)
我正在使用以下代码从 .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
}
(或任何你需要创建它的地方)