在SceneKit中绘制3D圆弧和螺旋线

Mau*_*itz 4 scenekit swift

这里最近的一个问题让我再次想到了SceneKit,我想起了一个我从未解决过的问题.

我的应用程序使用SK显示天线设计.大多数天线使用金属杆和网状反射器,因此我使用SCNCylinder作为杆,SCNPlane作为反射器,SCNFloor作为地面.整个事情花了几个小时,我完全是3D的菜鸟.

但有些天线使用的是弯曲成弧形或螺旋形的导线,我在这里进行了踩踏,并使用几个圆柱体端对端制作了蹩脚的分段物体.它看起来很奇怪.

理想情况下,我想要一个单独的对象,使圆弧或螺旋呈现圆柱形横截面.基本上是SCNTorus,但具有开始和结束角度. 这篇文章讨论了在SK中使用UIBezierPath,但它用于extrude生成类似带状的形状.有没有办法做类似但具有圆柱横截面(如部分SCNTorus)?

我知道我可以通过创建顶点(和法线等)来制作自定义形状,但我希望我错过了一个更简单的解决方案.

ric*_*ter 6

你可以做的弧SCNShape.从我的另一个答案的技术开始,得到一个挤压的,带状的弧形.您需要确保路径追溯的部分偏移了与挤出深度相同的距离,因此您最终会得到横截面为方形的形状.

要使其横截面为圆形,请使用chamferProfile属性 - 为其指定一个四分之一圆的路径,并将倒角半径设置为等于挤出深度的一半,并且四个四分之一圆倒角将相遇,形成圆形横截面.

螺旋是另一个故事.SCNShape采用平面路径 - 仅在两个维度上变化的路径 - 并将其挤出以形成三维实体.螺旋是一个三维变化的路径.SceneKit没有任何描述这种术语形状的东西,所以这里没有超级简单的答案.

着色修改器解决方案@HalMueller暗示有趣,但有问题.在几何入口点使用修改器进行简单的弯曲很简单 - 例如,将每个y坐标偏移一定量,即使是一个与原因相关的量.但这是一个一维变换,所以你不能用它来缠绕自己的线.(它也会改变横截面.)最重要的是,着色修改器在渲染时发生在GPU上,因此它们的效果是幻觉:SceneKit模型中的"真实"几何体仍然是一个圆柱体,所以像命中测试这样的功能适用于此而不是转换后的几何体.

制作类似螺旋的最佳解决方案可能是自定义几何 - 生成自己的顶点数据(SCNGeometrySource).如果您遵循该形状的定义,则在螺旋上找到点集的数学计算非常简单.要围绕它包裹横截面,请按照Frenet公式在螺旋上的每个点创建局部坐标系.然后创建一个索引缓冲区(SCNGeometryElement)将所有这些点拼接成带有三角形或三角形的表面.(好吧,围绕一个深层主题,这是一个很大的挥手,但是一个完整的教程对于一个SO答案来说太大了.这应该足以让我们开始使用面包屑了,不过......)