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

莫里·马克维兹(Maury Markowitz)

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

我的应用程序使用SK显示天线设计。大多数天线使用金属棒和网状反射器,因此我将SCNCylinder用于棒,将SCNPlane用于反射器并将SCNFloor用于地面。整个过程花了几个小时,而我完全不喜欢3D。

但是有些天线使用弯曲成弧形或螺旋形的线,我在这里穿线,并使用多个圆柱体首尾相连地制作了残破的分段物体。看起来很疯狂。

理想情况下,我想要一个具有圆柱横截面的弧形或螺旋形的单个对象。基本上是SCNTorus,但具有开始和结束角度。这篇文章讨论了如何在SK中使用UIBezierPath,但是它用于extrude产生带状形状。有没有办法做类似的事情但有圆柱横截面(例如部分SCNTorus)?

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

rick

您可以使用的弧线SCNShape从我的其他答案开始,从技巧开始,得到一条带状,弧形的弧形。您将要确保路径追溯到其自身的部分偏移了与拉伸深度相同的距离,因此最终得到的横截面为正方形。

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

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

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

制作类似螺旋线的最佳解决方案可能是自定义几何-生成自己的顶点数据(SCNGeometrySource)。如果遵循该形状的定义,在螺旋上查找点集的数学就非常简单要在其周围包裹横截面,请遵循Frenet公式在螺旋线的每个点上创建一个局部坐标系。然后使用索引缓冲区(SCNGeometryElement)将所有这些点缝合到带有三角形或三条纹的表面上。(好吧,这是一个很深的话题,要花很多精力,但是完整的教程对于SO答案来说太大了。尽管如此,这足以使它起步,但是...)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何围绕list给出的曲线绘制螺旋线?

来自分类Dev

matplotlib在3D中绘制多条线

来自分类Dev

matplotlib在3D中绘制多条线

来自分类Dev

Matlab绘制多条3D线

来自分类Dev

PDF生成中的绘制和弧线

来自分类Dev

3D图中对象的顺序-螺旋

来自分类Dev

如何在八度/ Matlab中绘制3D线

来自分类Dev

在Julia中以3D方式绘制一条线

来自分类Dev

在matlab中在两个补丁之间绘制3D线

来自分类Dev

如何在QML场景上绘制3D线?

来自分类Dev

如果点位于对数螺旋线附近:不在中心附近返回点

来自分类Dev

如何绘制与初始线有角度偏移的多条 3d 线?

来自分类Dev

在Matlab中绘制3d贝壳

来自分类Dev

在3D中绘制正态分布

来自分类Dev

在3D surfaceplot中绘制DataFrame

来自分类Dev

在Matlab中绘制3D曲面

来自分类Dev

在3D中绘制多个系列

来自分类Dev

在Matlab中绘制3D平面?

来自分类Dev

在R中绘制散点图3D

来自分类Dev

在d3.js中向svg元素附加和弧线

来自分类Dev

从1d,3d位置获取螺旋索引

来自分类Dev

在R中的3D散点图中添加点和线

来自分类Dev

Gnuplot 3d曲面图和重叠线?

来自分类Dev

绘制3d和2d子图

来自分类Dev

使用R在3d中绘制点和超平面

来自分类Dev

在R中绘制多个不同尺寸和坐标的3D框

来自分类Dev

无法使用 Numpy 和 Matplotlib 在 Python 中绘制 3D 医学图像

来自分类Dev

2D绘制3D点云作为一组线

来自分类Dev

从中心按顺时针方向扩展螺旋线打印二维阵列