如何在Swift中使用Bezier路径在3D空间中连接两个SCNSphere?

时间:2016-04-04 00:37:57

标签: swift scenekit uibezierpath

我有以下代码:

    func createScene(){
    count += 1

    let sphereGeom = SCNSphere(radius: 1.5)
    sphereGeom.firstMaterial?.diffuse.contents = UIColor.redColor()
    let path = UIBezierPath()
    path.moveToPoint(CGPoint(x: 0, y: 0))

    let radius = 3.0
    var radians = Double(0)
    var yPosition = Float(5.4)

    while count <= 20 {

        if radians >= 2{
            radians -= 2
        }

        let sphereNode = SCNNode(geometry: sphereGeom)
        let angle = Double(radians * M_PI)

        let xPosition = Float(radius * cos(angle))
        let zPosition = Float(radius * sin(angle))

        sphereNode.position = SCNVector3(xPosition, yPosition, zPosition)

        let cgX = CGFloat(xPosition)
        let cgY = CGFloat(yPosition)

        path.addQuadCurveToPoint(CGPoint(x: cgX, y: cgY), controlPoint: CGPoint(x: (cgX / 2), y: (cgY / 2)))
        path.addLineToPoint(CGPoint(x: (cgX - (cgX * 0.01)), y: cgY))
        path.addQuadCurveToPoint(CGPoint(x: 1, y: 0), controlPoint: CGPoint(x: (cgX / 2), y: ((cgY / 2) - (cgY * 0.01))))

        let shape = SCNShape(path: path, extrusionDepth: 3.0)
        shape.firstMaterial?.diffuse.contents = UIColor.blueColor()
        let shapeNode = SCNNode(geometry: shape)
        shapeNode.eulerAngles.y = Float(-M_PI_4)
        self.rootNode.addChildNode(shapeNode)

        count += 1
        radians += 0.5556
        yPosition -= 1.35

        self.rootNode.addChildNode(sphereNode)

    }

我想添加一条Bezier路径,将每个球体连接到下一个球体,从而在螺旋线上创建螺旋线。出于某种原因,当我添加此代码时,甚至不会出现形状。但是当我使用更大的x和y值时,我看到路径很好,但它无法定位到球体的大小。当我试图让它变小时,我不明白为什么它会消失。

1 个答案:

答案 0 :(得分:0)

你的SCNShape并没有被挤压。按Apple doc,

  

挤出深度为零会形成扁平的单面形状。

如果X / Y值较大,则您的扁平形状会变得可见。但是,您无法使用SCNShape构建3D螺旋:挤出的起始平面和结束平面是平行的。

您必须使用自定义几何体,或使用一系列细长的SCNBox节点逼近您的螺旋线。而且我打赌那里有人知道如何用着色器做到这一点。