繁体   English   中英

UIBezierPath二次曲线是一条直线

[英]UIBezierPath Quadratic Curve is a Straight Line

我正在尝试创建一个弯曲的箭头以显示在ARKit场景中,但是,箭头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))

应该产生这样的形状:

在此处输入图片说明

而是将其呈现为箭头的尾部没有任何曲线:

在此处输入图片说明

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

编辑:

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

在此处输入图片说明

阅读SCNShape path文档 它说:

路径的平坦度(请参见NSBezierPath的平坦flatness )确定SceneKit从路径构建三维形状时使用的细节级别-更大的平坦度值导致较少的多边形渲染,从而提高了性能。

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

UIBezierPath的默认flatnessUIBezierPath 文档说明如下:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM