swift - UIBezierPath二次曲线是一条直线

标签 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

最佳答案

阅读the SCNShape path documentation .它是这样说的:

The path’s flatness (see flatness in NSBezierPath) determines the level of detail SceneKit uses in building a three-dimensional shape from the path—a larger flatness value results in fewer polygons to render, increasing performance.

(因为您使用的是 iOS,请将 UIBezierPath 替换为 NSBezierPath。)

UIBezierPath 的默认平坦度 是多少?这是the documentation说:

The flatness value measures the largest permissible distance (measured in pixels) between a point on the true curve and a point on the rendered curve. Smaller values result in smoother curves but require more computation time. Larger values result in more jagged curves but are rendered much faster. The default flatness value is 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.

关于swift - UIBezierPath二次曲线是一条直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53325592/

相关文章:

swift - PDFKIT iOS 11,在 PDFDocument 中保存注释页面

swift - 去初始化时强引用不会变成弱引用

ios - ARKit session 暂停且未恢复

ios - 从点云手动创建 ARReferenceObject

swift - 计算属性和带闭包的属性集之间的区别

swift - 是否可以将输入的文本保存到 SwiftUI 的警报文本字段中,并像这样在应用程序中显示它 -> Text ("alert text input here")?

ios - 在几秒钟内重新加载 UiPageViewController

swift - ARKit——与真实世界物体的碰撞

swift - NSURLSession,完成 block ,Swift

ios - 在 iOS 上将图像和文本内联居中