【问题标题】:Creating a subclass of a SCNNode创建 SCNNode 的子类
【发布时间】:2023-03-17 04:35:01
【问题描述】:

我正在使用以下代码从 .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

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

【问题讨论】:

    标签: swift scenekit


    【解决方案1】:

    好吧,你的代码不能工作。

    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 文件加载的节点中已经包含几何图形。
    • @HariSeldon 改变什么颜色?椭圆体的?
    • 是的,根据我的 Ellipsoid 子类代码,用 newNode() 初始化一个椭球应该给我一个随机颜色的对象,但这不会发生,因为 self.geometry?返回零。这是否意味着我从 .dae 文件加载的节点没有几何属性?非常感谢您的帮助
    • @HariSeldon 您的椭球体没有从文件中加载。您从文件加载场景并将该场景的节点添加到 Ellipsoid。所以你的椭球有很多子节点,但没有几何。您将需要显式地创建一个并将其添加到 Ellipsoid。 (您可以通过将self.geometry?.firstMaterial!.d... 中的问号更改为感叹号来验证这一点。如果我是对的,您的程序应该会崩溃)
    • 我就是这么想的,那么我应该如何修改我的程序才能改变椭球的颜色呢?
    猜你喜欢
    • 2015-06-19
    • 2017-10-03
    • 2019-04-18
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    相关资源
    最近更新 更多