程序几何生成


10

我最近一直在研究OS X的SceneKit,并注意到有几种工厂方法可以创建几何形状,例如:

框,胶囊,锥,圆柱,平面,金字塔,球体,圆环和管。

我有兴趣在我的渲染器中添加这样的原始形状,但是我一直在努力寻找任何合理的来源,从中我可以收集对程序生成的理解。有许多资源详细介绍了该理论,但是缺少适当的源代码来对其进行备份。

SceneKit提供了工厂方法,该方法允许动态设置此类形状的属性。对于Box,可以为每个面应分为的宽度,高度和深度段数提供整数值。

我了解理论,但缺乏知识来开始细分几何面以实现所需的效果。

每个形状的顶点很可能很容易在简单的循环中生成。让我感到困扰的是,我知道如何创建这些面,或者是为每个面创建适当的纹理坐标。可以按每张面孔计算法线,因此我很自信可以实现自己想要的目标,只是知道从哪里开始。

谁能提供有关程序几何的任何详细信息?我真正需要的是一些源代码来收集一些信息。我在教程中搜索了很多内容,但到目前为止,只提出了一些合理的站点或博客。任何优秀的书籍,教程,博客或研究论文将不胜感激。

根据评论进行编辑

我应该澄清的是,我知道如何为基本形状创建顶点,其中大多数可能可以通过简单的循环来实现。我不理解的是如何从生成的顶点数组创建面。如何从看似无序的顶点阵列中创建一个或多个三角形带?

我假设一旦超过了这一点,就可以从每张脸创建法线。尽管我还没有深入研究,但是我已经看到了很多对此的参考,并且确信它很容易实现。

理想情况下,我希望能够从一组给定的属性(例如SceneKit提供的方式)生成几何。鉴于SceneKit已经做到了,并且您可以在Blender和Maya等中做类似的事情,我想我不是在尝试实现不可能的事情。

最后一个方面是应用纹理。再说一次,这不是我实现的,但是已经阅读并了解了需求。

这里的主要问题是我知道我想要实现什么,但是正在努力解释如何为上述原语实现。我希望能够通过源代码找到一些相似的知识,但是到目前为止,我确实还没有遇到任何合适的东西。


您说您的问题是细分几何,但是您说制作顶点应该很容易,然后又说问题是如何创建面,然后又说问题是纹理贴图。你有什么问题?您可以生成顶点位置吗?您可以生成边缘和面吗?此外,纹理坐标取决于您的纹理以及要使用该纹理实现的功能,因此关于纹理坐标的问题并不是一个好问题。最后,图元的产生只是关于几何的,人们很少称其为“过程几何”,尽管这就是事实。
jrsala 2013年

我了解如何为简单的形状(例如立方体或平面)创建几何形状,以及如何创建我不了解的面。如何从一堆顶点创建面?即使我有一个基本的了解,为更复杂的形状绘制点也是问题的一部分。我正在努力将它们粘在一起,形成一个或多个三角形条。
CaptainRedmuff 2013年

好的,谢谢您的详细信息。您可能需要编辑问题以澄清问题。接听时间!
jrsala 2013年

Answers:


11

生成诸如盒子,圆锥体和所有引用的原始形状的边缘和面的方法是在创建顶点的同时生成它们。实际上,您应该以合理的方式创建顶点,以便轻松计算相应的边和面。

有一些算法将空间中的一组点作为输入并在其上计算一个所谓的“ 点集三角剖分 ”,但是点集三角剖分的问题是NP完全的,因此可以更快地制作边缘和面而不是只计算顶点并让算法完成工作。只是让您知道此解决方案存在。

除了这种效率不高的解决方案之外,我认为您只能按情况处理基元,如以下示例所示。

网格是顶点和面。除非网格物体包含不构成面的线,否则边将包含在面的描述中。顶点是3个浮点坐标的元组。边只是顶点的参考对,但是同样,您当然也不需要它们。假设您的顶点在一个索引数组中。那么,您的边缘可能就是该数组的索引对。在索引数组的情况下,面是引用顶点的三元组或索引的三元组

您应该能够计算构成这些基本形状的每个顶点,边缘和面,因为能够对其进行计数意味着了解对象的属性,这有助于您设计使用其构建对象的方法,使用循环和其他工具,我们将看到。

锥体

对于具有n + 2个顶点,3n个边和2n个面的圆锥:

  1. 制作两个单独的顶点。
  2. 围绕其中一个顶点(基本顶点)在与前两个​​顶点之间的线段垂直的平面内绕一个圆。希望您可以使用三角法画一个圆,对吗?那已经是圆锥体的所有顶点了。这也是所有边的三分之一(圆中有n个边,总共有3n 边)。
  3. 从基本顶点到圆中的n个顶点制作n条边。这样做时,您可以制作一半的面孔(即n张面孔)。
  4. 从尖端顶点到圆中的n个顶点制作n条边。这样做时,您可以制作另一半张面孔(即n张面孔)。

1)两个顶点 2)和一个圆圈
3)和面孔
4)和面孔
最终结果:结果

您还可以在运行构成圆的循环时创建边缘和面。同样的复杂性,同样的事情。在圆上创建一个顶点,将其存储到顶点数组中,如果需要,将相应的边(索引对)添加到索引对数组中,最后将对应的面添加到索引三元组数组中。移至下一个顶点。

缸筒:两次不做相同的工作,四边形

再次,对于管,它以顶点和圆开始,这将是圆柱体顶部或底部圆盘的中心:

  1. 制作一个顶点。
  2. 在顶点周围画一个圆。在圆的连续顶点之间,中心顶点和每个圆顶点之间添加边(如果需要边)。在由中心顶点构成的每个顶点三次和圆上的两个连续顶点之间添加面。
  3. 复制所有内容,然后按照所需圆柱体的长度在垂直于刚制作的底座的方向上平移副本。
  4. 链接顶部和底部。

要链接顶部和底部,必须在彼此面对的成对顶点之间成四边形。因此,请思考一下,为什么不使自己成为一个在四个顶点中构成两个三角形面的函数呢?

做完了 请注意,这一次我们使用了一个事实,即相同的结构(圆+中心)在圆柱体中出现两次,以作为捷径。我们不必手工制作所有的顶点,边和面,而与必要的圆锥体相反。

遵循这种懒惰原理,也可以只制作四分之一的圆并复制它,然后再次进行非常简单的变换即可制作一个完整的圆(对任何圆都有效,因此对圆锥也有效),但这对于没有那么复杂的形状。

您必须始终使用所制造对象的几何特性来简化其制造。即它们的对称性不变性

对于圆柱体,只需不制作基础顶点,只需制作圆,重复,平移副本,完成四边形即可。

球体和胶囊:增加了复杂性,但仍无法完成两次相同的工作

要创建胶囊,我们要创建一个UV球,将其分成两半,平移前半部分,然后将其与胶囊的侧面连接起来。

再次可以只制作一个球的八分之一(!!),然后将其复制并反转,然后沿另一个轴复制并反转结果,除了沿另一个轴等,以四个步骤得到一个完整的球(创建第八个) ,重复并反转3次)。可能会造成过大杀伤力,但比起圈来的情况要少。

一个简单的紫外线球:
球

实际上,我们实际上只制作了一半(例如),复制了一半,将副本上下颠倒,然后按照胶囊的长度进行平移:
一半

我们链接上半部分和下半部分:
胶囊

真正的(有点)艰苦的工作来自制作球体的三角学。属于UV球的所有顶点的集合可以描述为以下形式的所有点的集合:

点数

其中R是球体的半径,对于某个正偶整数N,我们有一个常数

θ=×π/ N

kn是整数,其中k02N-1之间变化,n-N / 2+ N / 2之间变化

要制作半球或球的一半,您必须限制kn所取值的集合。

如果k是实数而不仅仅是整数,那么您将得到一个整个球体,而不仅仅是其表面上的顶点。因此,我们在这里所做的是栅格化图元的表面方程

可怕的圆环:毕竟我们已经很容易看到了!

同样,更多的三角函数,更多的顶点,更多的四边形,更多的对称性,更多的不变性...更多的几何!找出圆环表面的方程式,对其进行“栅格化”,使用圆环的(明显)对称性简化问题,最后遍历您刚刚定义的一组顶点,并在创建边缘和面时走!

看到?完全简单。


哇。谢谢您提供如此详尽的回复以及这么多示例。我没有考虑过只生成一个球体的一半并镜像对称元素的想法。非常感谢您抽出宝贵的时间以我易于理解的方式编写此书,并希望可以轻松地将其付诸实践。
CaptainRedmuff

别客气!对不起,虽然没有代码。
jrsala

方法的概要更多地是我真正需要的。我至少可以从那里开始制定行动计划:]我不认为您对带有倒角边缘的盒子/立方体有任何了解吗?docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-Help/images/...
CaptainRedmuff

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.