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

5
最近这里的一个问题让我再次想起了SceneKit,并且我记得我从未解决过的一个问题。我的应用程序使用SK显示天线设计。大多数天线使用金属杆和网格反射器,因此我使用SCNCylinder来表示杆、SCNPlane来表示反射器和SCNFloor来表示地面。整个过程花了几个小时,而我对3D一窍不通。但是有些天线使用弯成弧形或螺旋形的电线,我在这里放弃了,使用了几个端对端的垃圾分段对象。它看起来很差。理想情况下,我希望有一个单一的对象,可以呈现具有圆柱形横截面的弧形或螺旋形。基本上是SCNTorus,但具有起始角度和结束角度。此帖子讨论了在SK中使用UIBezierPath的方法,但它使用extrude来产生类似于带状形状的形状。是否有一种类似的方法,但具有圆柱形横截面(如局部SCNTorus)?我知道我可以通过创建顶点(和法线等)来制作自定义形状,但我希望我错过了更简单的解决方案。
2个回答

8
您可以使用 SCNShape 来创建一条弧线。您可以从我的其他答案中了解到如何使用该技术来获得一个类似带状的、挤出的弧线。确保路径上回溯的部分偏移了与挤压深度相同的距离,这样您就可以得到一个在横截面上呈正方形的形状。
要使其在横截面上呈圆形,则可以使用 chamferProfile 属性,将其设置为四分之一圆形的路径,并将挤出半径设置为挤压深度的一半,四分之一圆角削切将会相遇,形成圆形的横截面。
螺旋线是另一种情况。 SCNShape需要一个平面路径,即仅在两个维度上变化的路径,并将其挤出以制作三维实体。而螺旋线则是在三个维度上变化的路径。SceneKit没有描述此类形状的任何内容,因此这里没有超级简单的答案。
@HalMueller提到的着色器修改器(shader modifier)解决方案很有趣,但存在问题。在几何体入口点使用修改器使一个简单的折弯很容易,例如沿Y坐标偏移一些量,即使是某个函数的函数。但这是一个一维转换,因此您不能将其用于将电线缠绕到自身上。(它还会改变横截面。)除此之外,着色器修改器在渲染时在GPU上执行,因此它们的效果是虚幻的。SceneKit模型中的“真实”几何体仍然是一个圆柱体,因此诸如命中测试之类的功能适用于该模型,而不适用于转换后的几何体。
创建类似螺旋线的最佳解决方案可能是自定义几何体 - 生成自己的顶点数据(SCNGeometrySource)。如果您遵循该形状的定义,则可以轻松找到螺旋线上的点集。要将横截面包裹在其周围,请按照Frenet公式在螺旋线上每个点创建一个本地坐标系。然后制作一个索引缓冲区(SCNGeometryElement)将所有这些点缝合成三角形或三角带表面。(好吧,这是一个涉及深入主题的大量手波,但完整的教程太长了。这应该足以让您开始了...)

非常优秀的答案。关于命中测试的那一点尤其有趣,而且是我从未考虑过的事情。 - Maury Markowitz

2

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

一种方法是使用更多的圆柱体并使它们更短。这就是SCNGeometry基元上各种“segmentCount”属性背后的相同思想。我们能看到当前链接的圆柱体版本的屏幕截图吗?

如果增加“heightSegmentCount”,您可以使用此处概述的方法:scenekit,如何弯曲一个对象

我刚才看了一下SCNShape。我认为您可以使用着色器修改器将挤出的形状弯曲成圆形横截面。但是SCNShape似乎没有公开段数属性,我认为您需要创建足够的挤出段才能获得良好的外观。 “chamferRadius”和“chamferProfile”属性看起来很有趣。我想知道您是否可以使用它们来创建一个看起来不错的挤出物。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接