4

我想用 SceneKit 画一条贝塞尔曲线,并认为这会起作用:

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 渲染

有谁知道为什么 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))

我可以得到这个:弯曲

但是我想我不想填充形状。理想情况下,弯曲的管状线是我在这里想要实现的。(想象一下电源线或类似的东西......)。我想我很想拥有相当于 SCNLine 或 SCNTube 的“在贝塞尔路径上渲染”

4

2 回答 2

3

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

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

于 2015-06-25T14:22:18.570 回答
2

这是工作!很好,我可能会补充。

问题是,你所有的点都在同一条线上,y=x

尝试更改您的控制点以使其具有以下值y!=x

前任,

    path.addCurveToPoint(CGPoint(x: 20, y: 20),
    controlPoint1: CGPoint(x: 15, y: 0),
    controlPoint2: CGPoint(x: 20, y: 10))
于 2015-06-25T11:36:43.047 回答