1

我正在尝试创建一个用于在 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)
}

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

SCNNode(geometry: createTurnArrow(.right))

应该产生这样的形状:

在此处输入图像描述

而是在没有任何曲线的情况下将其渲染到箭头的尾部:

在此处输入图像描述

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

编辑:

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

在此处输入图像描述

4

1 回答 1

4

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

路径的平坦度(参见flatness参考资料NSBezierPath)决定了 SceneKit 在从路径构建 3D 形状时使用的详细程度——平坦度值越大,要渲染的多边形越少,从而提高性能。

(由于您使用的是 iOS,请替换UIBezierPathNSBezierPath.)

a的默认值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.
于 2018-11-15T18:48:35.220 回答