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