UIBezierPath二次曲线是一条直线

时间:2018-11-15 18:15:35

标签: swift swift4 arkit uibezierpath quadratic-curve

我正在尝试创建一个弯曲的箭头以显示在ARKit的场景中,但是箭头杆的曲率只是在两侧都呈现为一条直线。

func createTurnArrow(_ direction: Direction) -> SCNShape {
    let path = UIBezierPath()
    path.move(to: CGPoint(x: 0.2, y: 0)) // A
    path.addLine(to: CGPoint(x: 0, y: 0.2)) // B
    path.addLine(to: CGPoint(x: 0, y: 0.1)) // C
    path.addQuadCurve(to: CGPoint(x: -0.3, y: -0.3), controlPoint: CGPoint(x: -0.3, y: 0.1)) // Curve 1
    path.addLine(to: CGPoint(x: -0.1, y: -0.3)) // D
    path.addQuadCurve(to: CGPoint(x: 0, y: -0.1), controlPoint: CGPoint(x: -0.1, y: -0.1)) // Curve 2
    path.addLine(to: CGPoint(x: 0, y: -0.2)) // E
    path.close()

    return direction == .left ?
      SCNShape(path: path.reversing(), extrusionDepth: self.defaultDepth) :
      SCNShape(path: path, extrusionDepth: self.defaultDepth)
}

我的直觉告诉我使用此功能创建一个节点:

SCNNode(geometry: createTurnArrow(.right))

应产生如下形状:

enter image description here

但是将其渲染成箭头的尾部没有任何曲线:

enter image description here

我已经尝试了很多其他数学运算来获得二次曲线的当前控制点,但是没有什么可担心的。有什么想法吗?

编辑:

在哪里有绘制点的示意图,以及我对如何使用曲线进行渲染的假设。

enter image description here

1 个答案:

答案 0 :(得分:3)

阅读the SCNShape path documentation。它说:

  

路径的平坦度(请参见flatness中的NSBezierPath)确定SceneKit从路径构建三维形状时使用的详细程度-平坦度值越大,渲染的多边形越少,从而增加性能。

(由于您使用的是iOS,请用UIBezierPath代替NSBezierPath。)

flatness中默认的UIBezierPath是什么? the documentation的内容如下:

  

平坦度值测量真实曲线上的点与渲染曲线上的点之间的最大允许距离(以像素为单位)。较小的值可使曲线更平滑,但需要更多的计算时间。较大的值会导致更多的锯齿曲线,但渲染速度会更快。默认的平坦度值为0.6。

现在将默认的平坦度(0.6)与形状的整体大小(0.5×0.5)进行比较。请注意,平面度大于形状的尺寸!因此,您的每条曲线都将变平为一条直线。

将路径的平坦度更改为更适合您的形状,或将形状的比例更改为更适合默认平坦度。

let path = UIBezierPath()
path.flatness = 0.05 // <----------------------- insert this statement
path.move(to: CGPoint(x: 0.2, y: 0)) // A
path.addLine(to: CGPoint(x: 0, y: 0.2)) // B
// etc.