|
128703
Dixon 发表于 2014-12-5 16:07:24
楼主
本帖最后由 Dixon 于 2014-12-7 11:18 编辑
GH中实现几何体龟裂效果
前段在网上看到这个小陶器感觉挺喜欢于是买了一个。拿到后仔细观察了一下表面的裂纹纹理,的确有一种很特别的美感。正好那段时间在琢磨GH的教学素材,就想到用程序来模拟这种龟裂效果应该是挺不错的范例。网上查了一下也没找到有人研究这个,于是自己花了点时间去尝试。做完后觉得中间出现的一些问题较为复杂,已经不是太合适作为教学来用,因此我直接吧做好的程序打包给大家下载使用,并在这里简要介绍思考的过程和中间遇到的问题,希望给学习gh的用户一些参考和建议。
先找了一张比较标准的龟裂纹作为造型参考
学习编程,可能初期是在学编程语言的语法,学到后面就是学算法。算法是什么?其实就是用程序语言描述的解决问题的思路。学习编程主要就是学习如何建立这种“思路”。那么对于这个龟裂纹,思路是什么呢,首先我们通过观察可以发现这种龟裂纹其实就是物体裂开的状态。大块裂成小块,小块裂成更小的块。所以思路的大框架就是我们需要写一个让物体裂开的程序,然后利用循环的逻辑让这段程序反复计算,让之前开裂产生的碎片再次开裂,这样整体来看就会形成网络状的裂纹。
那么开裂的程序要如何做呢?我们就需要设计一个算法,让物体能够产生较为自然的开裂效果。整个程序中主要就是在实现这个开裂的功能。我们的思路是,利用实体分割的工具把物体割开,因此我们需要针对每一块开裂的物体生成一块必须的切割面。这块切割面必须与物体相交且能把物体一分为二。另外每一块切割面的形状都是随机的曲面,让每一个开裂的形态都会有些随机的不同。但过于随机也是不够好的,因为实际上物体的开裂还是有一定的规律,例如下面这块碎片,如果我们给出两个假设的开裂方向 A和B,哪一个比较符合实际情况呢?
很多时候根据我们生活中的经验可以得出结论,判断应该是a方向。为什么呢?因为对于这种长条形比较明显的物体,较窄的方向(a方向)因为较为薄弱,因此受到外力后更容易从这里发生断裂。因此从几率来说 a方向裂开的可能性更大。因此实际上经过我饿们的测试如果简单的给予任意随机的开裂方向出来的结果不不太好。 这一点来说比较具备编程可控性的特点,也即是说我们需要恰到好处的控制,给予一定空间,但是空间不能太大。就想好像这个开裂角度来说,我们要找到物体的比较薄弱的部位(断面较窄的方向)然后让实际的断开位置在理想位置的附近有一个随机的变化空间。这样出来的效果比较具备有一定随机性但整体来说是合理的结果。这部分我就不详细解释如何去做,有一定的gh经验的用户可以去看具体的gh程序来了解。
最后我们在编写过程中发现gh目前有两个工具还不不太理想:一个是 Populate Geometry (用于在brep物体上生成随机点)当brep或曲面是被切割后的一个小部分的时候,它的计算会显著便慢。变慢的原因我是可以理解的,需要更好地算法来处理,另外一个就是 Bounding Box ,同样是对于被切割过的brep,他的计算结果并不精确,也即是说没有完全包裹住几何体,会有漏出来的情况。这两个问题我已经回报给公司。但目前程序为了绕过这两个有问题的工具因此做过一些修改,因此变得解释起来很复杂,这是我们暂时不想把他作为教学范例的原因之一。
计算过程如下图动画所示。目前的计算并不算很快,因为最终都需要做实体的切割计算,这部分的计算是必定会耗费加多计算资源的。根据我们的测试,大部分的电脑,当超过1000快面需要做开裂计算的时候,大概需要等待10秒钟左右的计算时间。
程序如下图,我已经把写好的开裂部分做了打包,暂时不放源程序,但你可以下载程序来使用不受限制。
参加过原厂gh课程的同学如果需要学习源程序可以单独跟我说。
打包的程序在这里下载,请先在in高的GH中安装附件中的hoopsnake插件,否则程序不能运行。
http://pan.baidu.com/s/1dD5uyQ1
我觉得这个龟裂的效果可以作为一种初始的分割手段,后续可以吧分割线提取出来在做其他有趣的效果,如下是几个简单的测试。后续我们会在给程序加入一些控制选项,让开裂的密度可以有参数控制。如果你有什么建议也欢迎留言探讨。
裂纹形状控制参数值 参考:
弯曲强度:0~0.5之间 ,0为最容易弯曲 0.5为最值。
弯曲强度值 0.25
弯曲强度 0.15 ,裂痕弯曲的形状会比较多。
-dixon
2014-12-5
|
|