Создание подкласса 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")
    }
}

Как я могу «связать» этот подкласс с узлом, который я получаю с помощью newNode()? Я наивно думал, что с помощью чего-то вроде

let ellipsoid = newNode() as! Ellipsoid

будет работать, но это не так. Спасибо за ваше время и помощь.


person Hari Seldon    schedule 30.07.2015    source источник


Ответы (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
}

(или там, где вам нужно его создать)

person idmean    schedule 30.07.2015
comment
Это исправило это, но похоже, что мой код для назначения и изменения цвета не работает. Это потому, что это узел, и для этого мне нужен объект геометрии? Я думал, что в узлах, загруженных из файлов .dae, уже есть геометрия. - person Hari Seldon; 30.07.2015
comment
@HariSeldon меняет цвет чего? Из эллипсоида? - person idmean; 30.07.2015
comment
Да, согласно моему коду подкласса Ellipsoid, инициализация эллипсоида с помощью newNode() должна дать мне объект со случайным цветом, но этого не происходит, потому что self.geometry? возвращает ноль. Означает ли это, что узел, который я загружаю из файла .dae, не имеет свойства геометрии? Большое спасибо за твою помощь - person Hari Seldon; 30.07.2015
comment
@HariSeldon Ваш эллипсоид не загружается из файла. Вы загружаете сцену из файла и добавляете узлы этой сцены в свой эллипсоид. Итак, ваш эллипсоид имеет много дочерних узлов, но не геометрию. Вам нужно будет явно создать его и добавить на эллипсоид. (Вы можете убедиться в этом, изменив вопросительный знак в self.geometry?.firstMaterial!.d... на восклицательный знак. Ваша программа должна вылететь, если я прав) - person idmean; 30.07.2015
comment
Вот что я подумал, так как мне изменить мою программу, чтобы иметь возможность изменить цвет эллипсоида? - person Hari Seldon; 30.07.2015
comment
@HariSeldon В вашем инициализаторе создайте и назначьте геометрию. Что-то вроде self.geometry = SCNSphere(radius: 5) - person idmean; 30.07.2015