在ARKit中使用SceneKit绘制楔形遇UIBezierPath曲线异常问题
解决SCNShape绘制圆形楔形变成三角形的问题
嗨,我懂你遇到的糟心情况——本来想画个四分之一圆的扇形(楔形),结果曲线部分直接变成了直线,看起来活脱脱一个三角形对吧?这大概率是因为SceneKit处理贝塞尔路径时的默认曲线精度设置太高,把圆弧给简化成直线段了。
咱们来一步步修正你的代码:
问题根源
你的贝塞尔路径逻辑本身是没问题的:从圆心出发,画四分之一圆弧,再闭合回圆心。但UIBezierPath默认的flatness属性(控制曲线平滑度的阈值)是0.6,这个值偏大,SceneKit会把圆弧近似成直线来处理,所以就出现了三角形的效果。
修正方案
只需要给你的贝塞尔路径设置一个更小的flatness值,强制保留圆弧的平滑度,同时补全你没写完的材质代码:
let path = UIBezierPath() path.move(to: CGPoint.zero) // 设置更小的flatness,确保圆弧不会被简化 path.flatness = 0.01 path.addArc(withCenter: CGPoint.zero, radius: 0.5, startAngle: 0, endAngle: .pi/2, clockwise: true) path.close() let shape = SCNShape(path: path, extrusionDepth: 0.1) // 补全材质设置 let mat = SCNMaterial() mat.diffuse.contents = UIColor.orange shape.materials = [mat] // 创建节点并添加到场景 let wedgeNode = SCNNode(geometry: shape) // 适配坐标系差异:UIKit Y轴向下,SceneKit Y轴向上,旋转后符合视觉预期 wedgeNode.eulerAngles.x = .pi
额外说明
如果调整flatness后还是有问题,你也可以直接用SCNCylinder结合几何切割的方式做扇形,但用贝塞尔路径的话,调整flatness是最简单直接的解决办法。另外别忘了UIKit和SceneKit的坐标系差异,加个X轴旋转可以让扇形朝向符合你的预期。
内容的提问来源于stack exchange,提问作者Auzy
相关产品推荐
相关产品推荐

