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

时间:2016-01-08 15:33:16

标签: swift scenekit

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:2)

以下是一些可能有用的起点。

一种方法是使用更多的圆柱体并使它们更短。这与SCNGeometry原语上的各种segmentCount属性背后的想法相同。我们能看到当前链接柱面版的截图吗?

如果您增加heightSegmentCount,则可以使用此处列出的方法:scenekit, how to bend an object

我刚刚看了SCNShape。我原以为你可以使用着色器修改器将挤出的形状扭曲成圆形横截面。但是SCNShape似乎没有公开一个分段计数属性,我认为你需要创建足够的挤出段以获得良好的外观。 chamferRadiuschamferProfile属性看起来很有趣。我想知道你是否可以用这些来创造一个看起来很好的挤压。