2015-06-25 205 views
2

我想绘制SceneKit贝塞尔曲线,认为这会工作: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“在贝塞尔路径上渲染”

+0

好吧,为了使它更像线条形状,请尝试沿着任意轴平移所有点。 (CGPoint(x:20,y:-20)) path.addCurveToPoint(CGPoint(x:20,y:20),controlPoint1:CGPoint(x:10,y:0),控制点2:CGPoint(x:10,y:0))'(原始点) Then: 'path.moveToPoint(CGPoint(x:20,y:-17))' 'path.addCurveToPoint(CGPoint(x: (x:10,y:0),controlPoint2:CGPoint(x:10,y:3))' (对所有y值加3)。 研究倒角SCNShape并使用SCNLightTypeOmni或SCNLightTypeDirectional类型的SCNLight。 – jperl

回答

2

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

的问题是,所有的点位于同一直线上,y=x

试着改变你的控制点有地方y!=x

前,

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

谢谢 - 让我进一步,但不是我想要的,我会更新这个问题... – dijipiji

+1

我想我会喜欢有相当于SCNLine或SCNTube“在贝塞尔路径上呈现” – dijipiji

3

SCNShape刚刚建成值封闭的Bézier路径,并将始终填充(除了孔)。这些路径可以是完全自定义的,但始终会沿着轴线上的线段被挤出。你想要的是沿着任意路径挤出一个圆圈,这不被支持。

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