2

SCNNode の設定に使用される球体ジオメトリ (SCNSphere) の半径を返すにはどうすればよいですか。親ノードに関連していくつかの子ノードを移動する方法で半径を使用したいと考えています。以下のコードは、半径が結果のノードに不明であるように見えるため失敗します。ノードをメソッドに渡すべきではありませんか?

また、私の配列インデックスは、Int が Range ではないと言って失敗します。

私はこれから何かを構築しようとしています

import UIKit
import SceneKit

class PrimitivesScene: SCNScene {

    override init() {
        super.init()
        self.addSpheres();
    }

    func addSpheres() {
        let sphereGeometry = SCNSphere(radius: 1.0)
        sphereGeometry.firstMaterial?.diffuse.contents = UIColor.redColor()
        let sphereNode = SCNNode(geometry: sphereGeometry)
        self.rootNode.addChildNode(sphereNode)

        let secondSphereGeometry = SCNSphere(radius: 0.5)
        secondSphereGeometry.firstMaterial?.diffuse.contents = UIColor.greenColor()
        let secondSphereNode = SCNNode(geometry: secondSphereGeometry)
        secondSphereNode.position = SCNVector3(x: 0, y: 1.25, z: 0.0)

        self.rootNode.addChildNode(secondSphereNode)
        self.attachChildrenWithAngle(sphereNode, children:[secondSphereNode, sphereNode], angle:20)
    }

    func attachChildrenWithAngle(parent: SCNNode, children:[SCNNode], angle:Int) {
        let parentRadius = parent.geometry.radius //This fails cause geometry does not know radius.

        for var index = 0; index < 3; ++index{
            children[index].position=SCNVector3(x:Float(index),y:parentRadius+children[index].radius/2, z:0);// fails saying int is not convertible to range.
        }


    }

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

}
4

2 に答える 2

5

の問題は、 ではなくradiusparent.geometry返すことです。を取得する必要がある場合は、最初にキャストする必要があります。安全のために、オプションのバインディングとチェーンを使用してそれを行うのがおそらく最善です。SCNGeometrySCNSphereradiusparent.geometrySCNSphere

if let parentRadius = (parent.geometry as? SCNSphere)?.radius {
    // use parentRadius here
}

radiusノード上のにアクセスするときにも、これを行う必要がありますchildren。これらすべてをまとめて少し整理すると、次のようになります。

func attachChildrenWithAngle(parent: SCNNode, children:[SCNNode], angle:Int) {
    if let parentRadius = (parent.geometry as? SCNSphere)?.radius {
        for var index = 0; index < 3; ++index{
            let child = children[index]
            if let childRadius = (child.geometry as? SCNSphere)?.radius {
                let radius = parentRadius + childRadius / 2.0
                child.position = SCNVector3(x:CGFloat(index), y:radius, z:0.0);
            }
        }
    }
}

ただし、attachChildrenWithAngle2 つの子の配列で呼び出していることに注意してください。

self.attachChildrenWithAngle(sphereNode, children:[secondSphereNode, sphereNode], angle:20)

forこれを行うと、 3 番目の要素にアクセスするときに、そのループでランタイム クラッシュが発生します。その関数を呼び出すたびに、3 つの子を持つ配列を渡すか、そのforループのロジックを変更する必要があります。

于 2014-11-11T22:21:45.523 に答える