UIBezierPath 二次曲线是一条直线

m_c*_*ens 3 uibezierpath quadratic-curve swift swift4 arkit

我正在尝试创建一个弯曲的箭头以在 abARKit场景中显示,但是,箭头工作人员的曲率只是在两侧渲染为直线。

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)
}
Run Code Online (Sandbox Code Playgroud)

我的直觉告诉我用这个函数创建一个节点:

SCNNode(geometry: createTurnArrow(.right))
Run Code Online (Sandbox Code Playgroud)

应该产生这样的形状:

在此输入图像描述

而是将其渲染为没有任何曲线到箭头尾部:

在此输入图像描述

我尝试了一些其他数学方法来获取二次曲线的当前控制点,但不用担心。有任何想法吗?

编辑:

带有标绘点的原理图在哪里以及我对如何用曲线呈现的假设。

在此输入图像描述

rob*_*off 6

阅读文档SCNShape path它是这样说的:

\n\n
\n

路径\xe2\x80\x99s 平坦度(参见flatnessNSBezierPath决定了 SceneKit 在从路径\xe2\x80\x94 构建三维形状时使用的详细程度。较大的平坦度值会导致渲染更少的多边形,从而提高性能。

\n
\n\n

(由于您使用的是 iOS,因此请替换UIBezierPathNSBezierPath。)

\n\n

flatnessa 的默认值是什么UIBezierPath?这是文档的内容:

\n\n
\n

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

\n
\n\n

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

\n\n

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

\n\n
let path = UIBezierPath()\npath.flatness = 0.05 // <----------------------- insert this statement\npath.move(to: CGPoint(x: 0.2, y: 0)) // A\npath.addLine(to: CGPoint(x: 0, y: 0.2)) // B\n// etc.\n
Run Code Online (Sandbox Code Playgroud)\n