SceneKit绘制曲线

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 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“基于贝塞尔路径渲染”。

好的,为了使它更像一条线形状,请尝试沿着任意轴线转换所有点。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))(原始点) 然后: path.moveToPoint(CGPoint(x: 20, y: -17)) path.addCurveToPoint(CGPoint(x: -20, y: -17), controlPoint1: CGPoint(x: 10, y: 0), controlPoint2: CGPoint(x: 10, y: 3)) (将所有y值加3)。研究下如何倒角 SCNShape 并使用类型为 SCNLightTypeOmniSCNLightTypeDirectionalSCNLight - jperl
2个回答

3

SCNShape是由封闭的贝塞尔路径构建而成,并且总是被填充(除了孔洞)。这些路径可以完全自定义,但总是沿z轴的一个段上挤出。你想要的是沿一个任意路径挤出一个圆,但这不受支持。

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


2

它正在运行!我必须说,效果非常好。

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

尝试更改控制点的值,使得y!=x

例如,

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

谢谢 - 让我有了一些进展,但不是我想要的,我会更新问题... - dijipiji
1
我想我会喜欢拥有类似于SCNLine或SCNTube的“在贝塞尔路径上渲染”的等效功能。 - dijipiji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接