2016-01-08 33 views
3

这里最近的一个问题让我想起了SceneKit,我想起了一个我从未解决的问题。在SceneKit中绘制3D圆弧和螺旋

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

但是有些天线使用弯曲成弧形或螺旋线的导线,我在这里打线并使用几个气缸端到端制作蹩脚的分段物体。它看起来很狡猾。

理想情况下,我想单个物体呈现圆柱形横截面的圆弧或螺旋线。基本上SCNTorus,但有一个开始和结束角度。 This post谈到了在SK中使用UIBezierPath,但它使用extrude来生成一个带状的形状。有没有办法做类似的事情,但有一个圆柱横截面(如部分SCNTorus)?

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

回答

4

你可以用SCNShape做的弧。从我的其他答案开始,得到一个挤压的带状弧。您需要确保路径上的路径偏移距离与挤压深度相同,因此最终得到的横截面形状为正方形。

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

螺旋是另一回事。 SCNShape需要一个平面路径 - 一个仅在两个维度上变化的路径 - 并将其挤压成三维实体。螺旋线是一个三维变化的路径。 SceneKit没有任何描述形状的东西,所以这里没有超级简单的答案。

@HalMueller提到的着色器修改器解决方案很有趣,但存在问题。在几何入口点处使用修饰符很简单,可以进行简单的弯曲 - 比方说,将每个y坐标偏移一定量,即使其数量是原因的函数。但这是一个一维变换,所以你不能用它来缠绕自身。 (它也会改变横截面。)最重要的是,着色器修改器在渲染时发生在GPU上,所以它们的效果是一种幻觉:SceneKit模型中的“真实”几何体仍然是一个圆柱体,所以像命中测试这样的功能适用于该功能,而不适用于变换几何。

使诸如螺旋之类的东西最好的解决方案可能是自定义几何 - 生成自己的顶点数据(SCNGeometrySource)。如果你遵循那个形状的definition,在螺旋上找到一组点的数学很简单。要在其周围包裹横截面,请按照Frenet formulas在螺旋线上的每个点处创建局部坐标系。然后制作一个索引缓冲区(SCNGeometryElement)将所有这些点拼接成一个带有三角形或三角形的表面。 (好吧,围绕着一个深刻的话题,这是一个很大的手势,但是一个完整的教程对于答案来说太大了,尽管这应该足以成为一个面包屑导航,尽管......)

+0

最优秀的答案。关于命中测试的这一点特别有趣,而且我从未考虑过。 –

1

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

一种方法是使用更多的气瓶并使其更短。这与SCNGeometry原语上各种segmentCount属性背后的原理是一样的。我们可以看到当前链接版本的截图吗?

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

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