SceneKit绘制曲线

时间:2015-06-25 11:29:42

标签: uibezierpath scenekit scnnode

我想用SceneKit绘制一条bezier曲线,并认为这样可行:

func drawCurvedLine() {

    let scene = SCNScene()
    let scnView = self.view as! SCNView
    scnView.scene = scene
    scnView.allowsCameraControl = true

    let path = UIBezierPath()
    path.moveToPoint(CGPoint(x: -20, y: -20))
    path.addCurveToPoint(CGPoint(x: 20, y: 20),
        controlPoint1: CGPoint(x: 5, y: 5),
        controlPoint2: CGPoint(x: 15, y: 15))

    path.closePath()

    path.flatness = 0.3

    var scnShape:SCNShape = SCNShape(path: path, extrusionDepth: 2)

    scnShape.firstMaterial?.diffuse.contents = UIColor.purpleColor()
    let shapeNode = SCNNode(geometry: scnShape)
    scene.rootNode.addChildNode(shapeNode)
}

但是我的结果就像这个屏幕截图:SceneKit render

有谁知道为什么忽略curveTo控制点或如何打开它们?或者在SceneKit中绘制曲线的任何其他方法?

  • 编辑将路径坐标更新为:

    path.moveToPoint(CGPoint(x:-20,y:-20))         path.addCurveToPoint(CGPoint(x:20,y:20),             controlPoint1:CGPoint(x:10,y:0),             controlPoint2:CGPoint(x:10,y:0))

我可以得到这个:curved

然而,我想我想要填补这个形状。理想情况下,我想在这里实现弯曲的管状线。 (想象一下电源线或其他一些......)。我想我希望拥有相当于SCNLine或SCNTube“渲染贝塞尔路径”

2 个答案:

答案 0 :(得分:3)

SCNShape只需从封闭的Bézier路径构建,并且将始终填充(除了孔)。这些路径可以完全自定义,但始终沿着 z 轴沿着段挤出。你想要的是沿着任意路径挤出一个圆圈,这是不受支持的。

SCNGeometry公开了允许您构建任意几何的API。

答案 1 :(得分:2)

它正在工作!很好,我可以补充一下。

问题是,所有要点都在同一行y=x

尝试更改控制点,使其值为y!=x

前,

    path.addCurveToPoint(CGPoint(x: 20, y: 20),
    controlPoint1: CGPoint(x: 15, y: 0),
    controlPoint2: CGPoint(x: 20, y: 10))