微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

但有些天线使用弯曲成弧形或螺旋形的导线,我在这里进行了踩踏,并使用端对端的几个圆柱体制作了蹩脚的分段物体.它看起来很奇怪.

理想情况下,我希望单个对象呈现具有圆柱形横截面的弧或螺旋.基本上是SCNTorus,但具有开始和结束角度. This post讨论了在SK中使用UIBezierPath,但它使用拉伸来生成类似带状的形状.有没有办法做类似但具有圆柱横截面(如部分SCNTorus)?

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

你可以用SCNShape做一个弧.从我的另一个答案的技术开始,得到一个挤压的,带状的弧形.您需要确保路径追溯的部分偏移了与挤出深度相同的距离,因此您最终会得到横截面为方形的形状.

要使其横截面为圆形,请使用chamferProfile属性 – 为其指定一个四分之一圆的路径,并将倒角半径设置为等于挤出深度的一半,并且四个四分之一圆倒角将相遇,形成圆形横截面.

螺旋是另一个故事. SCNShape采用平面路径 – 仅在两个维度上变化的路径 – 并将其拉伸以形成三维实体.螺旋是一个三维变化的路径. SceneKit没有任何描述这种术语形状的东西,所以这里没有超级简单的答案.

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

制作类似螺旋的最佳解决方案可能是自定义几何 – 生成您自己的顶点数据(SCNGeometrySource).如果您遵循该形状的definition,则在螺旋上找到点集的数学计算非常简单.要围绕它绘制横截面,请按照Frenet formulas在螺旋上的每个点创建局部坐标系.然后创建一个索引缓冲区(SCNGeometryElement)将所有这些点拼接成带有三角形或三角形的表面. (好吧,围绕一个深刻的主题,这是很多的挥手,但是一个完整的教程对于一个SO答案来说太大了.这应该足以让我们开始使用面包屑,不过……)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐