如何在SceneKit中通过半径与原点参数绘制圆形节点?
SceneKit 圆形节点绘制方案
SceneKit 原生就支持绘制自定义半径、自定义原点位置的圆形节点,不需要引入额外第三方库,根据使用场景选下面两种实现方式即可:
实现方式
快速生成3D空间通用圆形节点
用内置的SCNCylinder圆柱几何是最简便的方案:把圆柱高度设为视觉可忽略的极小值,传入指定半径就能得到正圆形面片,几何默认锚点就在圆心位置,直接把节点坐标设为你需要的原点即可。
核心代码(Swift):// 替换为你实际需要的半径、原点坐标参数 let targetRadius: CGFloat = 1.5 let originCoordinate = SCNVector3(0, 2, -3) // 生成圆形几何,高度设为0.001不产生厚度视觉 let circleGeo = SCNCylinder(radius: targetRadius, height: 0.001) // 如果需要正反两面都可见就开启双面渲染,不需要可以关闭节省性能 circleGeo.firstMaterial?.isDoubleSided = true // 需要线框圆形而非填充圆形的话,打开下面这行配置 // circleGeo.firstMaterial?.fillMode = .lines // 创建节点并设置位置 let circleNode = SCNNode(geometry: circleGeo) circleNode.position = originCoordinate // 添加到场景 sceneView.scene.rootNode.addChildNode(circleNode)自定义平面圆形(适合2D场景、特殊轮廓需求)
如果需要圆形完全贴合指定平面、或者要做镂空、自定义分段等特殊效果,可以用UIBezierPath绘制圆形路径后,通过SCNShape生成几何。
核心代码(Swift):let targetRadius: CGFloat = 1.5 let originCoordinate = SCNVector3(0, 2, -3) // 绘制以路径原点为圆心的正圆 let circlePath = UIBezierPath( arcCenter: .zero, radius: targetRadius, startAngle: 0, endAngle: .pi * 2, clockwise: true ) // 挤出极小厚度生成平面几何 let circleGeo = SCNShape(path: circlePath, extrusionDepth: 0.001) let circleNode = SCNNode(geometry: circleGeo) circleNode.position = originCoordinate sceneView.scene.rootNode.addChildNode(circleNode)
补充小技巧:如果需要圆形节点始终朝向屏幕相机(比如做场景标记点),直接给节点添加
SCNBillboardConstraint约束即可,不需要手动计算旋转角度。
内容的提问来源于stack exchange,提问作者Joice George
相关产品推荐
相关产品推荐

