这里的一个最近的问题让我再次想到了SceneKit,我想起了一个我从未解决过的问题。
我的应用程序使用SK显示天线设计。大多数天线使用金属棒和网状反射器,因此我将SCNCylinder用于棒,将SCNPlane用于反射器并将SCNFloor用于地面。整个过程花了几个小时,而我完全不喜欢3D。
但是有些天线使用弯曲成弧形或螺旋形的线,我在这里线程,并使用多个圆柱体首尾相连地制作了残破的分段物体。看起来很疯狂。
理想情况下,我想要一个具有圆柱横截面的弧形或螺旋形的单个对象。基本上是SCNTorus,但具有开始和结束角度。 This post讨论了在SK中使用UIBezierPath的问题,但是它使用extrude
来生成带状形状。有没有办法做类似的事情但有圆柱横截面(例如部分SCNTorus)?
我知道我可以通过创建顶点(以及法线等)来制作自定义形状,但我希望我错过了一个更简单的解决方案。
最佳答案
您可以使用SCNShape
做的弧线。从我的其他答案开始,从技巧开始,得到一 strip 状,凸出的弧形。您将要确保路径追溯到其自身的部分偏移了与拉伸(stretch)深度相同的距离,因此最终得到的横截面为正方形。
要使其横截面为圆形,请使用 chamferProfile
属性-为它提供四分之一圆的路径,并将倒角半径设置为挤压深度的一半,然后四个四分之一圆的倒角会合,形成一个圆形横截面。
螺旋线是另一个故事。 SCNShape
采用一条平面路径(仅在两个方向上变化),然后将其拉伸(stretch)以形成三维实体。螺旋线是从三个维度开始变化的路径。 SceneKit没有任何用这种术语描述形状的东西,因此这里没有 super 简单的答案。
着色器修改器解决方案@HalMueller暗示很有趣,但存在问题。在几何体入口点使用修饰符进行简单的折弯很简单-例如,将每个y坐标偏移一定量,即使偏移量是为什么的函数。但这是一维变换,因此您不能使用它在自身上缠绕导线。 (它也会改变横截面。)最重要的是,着色器修改器在渲染时在GPU上发生,因此它们的效果是一种错觉:SceneKit模型中的“真实”几何体仍然是圆柱体,因此像 HitTest 这样的功能适用于此,而不适用于变换后的几何。
制作类似螺旋线的最佳解决方案可能是自定义几何-生成自己的顶点数据(SCNGeometrySource
)。如果遵循该形状的definition,则在螺旋上查找点的集合的数学运算非常简单。要在其周围包裹横截面,请遵循Frenet formulas在螺旋线的每个点上创建一个局部坐标系。然后创建一个索引缓冲区(SCNGeometryElement
),将所有这些点缝成带有三角形或三条纹的表面。 (好吧,这是一个很深的话题,要花很多精力,但是完整的教程对于SO答案来说太大了。尽管如此,这足以使它起步,但是...)
关于swift - 在SceneKit中绘制3D弧线和螺旋线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34680582/