C4D实现程序化道路网络
工作上有一些相关的内容。试着用Xpresso结合Mograph简单的实现“无机”的“程序化”。
在上一篇文章中提到的《无限城市程序化生成》,在C4D中实现有相当大的困难。个人总结一下,要做到“有机”的程序化程度大概有这么两点难处:
1.C4D是单线程,对于庞大的信息数据和逻辑处理能力有限(多线程的接口也只是模拟)。
2.C4D中没有类似于Houdini那样为点添加属性并便捷操控的能力,导致一些数据无法附着在点阵中去做逻辑信息读取(也许是个人没找到对应的方法)。
C4D中实际上是有可以承载点信息的TP粒子系统在前面的文章《如何做到用C4D玩经典扫雷游戏?你没看错》中就用到了TP粒子的自定义通道,但是由于TP粒子生成需要依托于物体发射(个人有限的理解),而物体还没有办法在正确的位置上生成,就演变成了先有蛋还是先有鸡的问题。届时解决这种无中生有的TP粒子的办法就可能要用到python,既然用到python还用什么TP粒子呢?
但是,工作上有一些相关的内容,还是做了一些尝试。试着用Xpresso结合Mograph简单的实现“无机”的“程序化”。之所以没采用Nodes是因为在项目中还不太常用,可能导致资源弃用吃灰,前功尽弃。
言归正传。
熟话说,复杂问题都是由简单问题构成的。归纳一下将要面对的问题:
1.大小地块的随机性,以及为后续制作楼体定位等预留信息。
2.主路路口和小路路口如何做连接。
3.道路标识如何随着道路的尺寸变换而匹配。
地块
用Xpresso在生成东西上是短板,它更善于去操控物体。所以能生成物体的除了粒子系统,Mogrph里能用到的就是克隆、对称了。通过克隆这个万金油工具能实现这个示例的大部分功能。克隆平面并将平面的分段设置为1,新建一个空对象作为承载XPresso的载体。
为载体添加用户数据,并设置好相应的数据类型。
再创建一个克隆平面并止于先前创建的克隆子集中,同时调整先前创建的克隆中修改克隆模式为随机。就可以得到一个随机穿插分布的大地块和小地块。为大地块和小地块添加子集对象倒角和运动图形挤压,用于控制地块的倒角和高度(用于模拟大路转弯和道沿)。在Xpresso的标签中,将两个克隆和倒角、运动图形挤压以及空对象添加进来。并为他们各自的相关参数添加上端点,连接即可。
路与路口
这个环节其实可以分成两个部分,一个是直路部分,另一个是路口部分。直路的部分相对简单一些。我们可以把直路部分做成一个动态图块,这样在横竖两个方向上可以重复利用也减少工作量。只通过路宽和路长两个参数作为动态图块的数据输入,其余的像地上的斑马线和道路标识都通过这两个参数去做固定的数学计算出来。新建一个克隆平面,并将参照上一个步骤去设置xpresso,将平面的长和宽与地块的克隆间距去数学计算。将空对象的主路宽度和中路宽度关联上。就可以实现控制道路的长和宽了。路口部分可以看作是一个方块的四个角做了倒角成为弧形。这样我们只要知道倒角半径和路口的尺寸就可以实现十字路口的部分了。拓展一些,可以加入类似于转弯等候区这类的地面标识增加丰富性。
道路标识
这个案例中的标识分为了5个类型:斑马线、双黄线、停止线、转向标志和行道线。下面分别介绍一下:
斑马线
将问题拆解来看,斑马线就是克隆出来的多个平面。并将这克隆出来的平面再克隆到直路的两端。我们接入的数据只有道路的长和宽,需要自定义一个固定的比例去适应道路尺寸的变化而保证斑马线的适应性(之前我自定义了很多个可控制的参数,但是思考后全部删除了。因为过多的可控性就意味着难以控制)。我将斑马线线条的窄边固定为道路宽度的30分之1,斑马线的线条长边为窄边的10倍。相应的克隆数量和间距的参数设置就不再赘述。
双黄线
这个部分我是用对称,将一个平面对称成两个,通过平面的位置改变两条黄线的间距。黄线的窄边我定义成了斑马线窄边的一半。黄线长度=道路长度-2*斑马线条长边长度-间隔
停止线
为了让停止线和斑马线的宽度一致,我们只需要将斑马线克隆宽度+斑马线的窄边就可以得到停止线的长度。同时,令停止线的宽度=1/2*斑马线窄边尺寸。并通过克隆将停止线克隆到道路的两端,克隆的尺寸改为道路长度-斑马线长边的尺寸-2*间隔。
转向标志
这个部分我还是使用了克隆做成2×2的矩阵类型。并通过将一个标志用对称做成两个,放置于克隆的子对象中。由于只有右侧两车道有这类提示,我将其余两个用空对象占位。标志的尺寸就等于道路的四分之一,可以做一些调整使标志不那么充实。
行道线
不用多说,还是克隆+对称的组合。行道线的长边=1/2*斑马线条的长边,行道线的短边=1/2*斑马线条的长边,这样能够使所有的线条都有同样的宽度,整齐划一。
克隆线条,并设置间隔为三倍的行道线长边的长度。克隆的长度与双黄线的对齐,就需要减掉一个行道线长边的长度。克隆的宽度就是道路的宽度*1/2。
总结归纳
至此,所有的绑定就都完成了。
同样的,动态的楼体建筑也是可以通过这个方式去拼装。再将端口留出楼体的长、宽、高。楼体的长和宽与地块的尺寸关联,楼体的高可以跟组域关联。通过xpresso控制几个参数就可以得到一个动态城市。由于篇幅和个人时间有限,没有添加楼体、交通指示灯、路灯、绿化树木等等的内容,但是方法已经明确了,只是花时间去操作,可以试试吧。
源文件下载
关注【西技大神】公众号,后台回复10003,即可获得下载链接。原创不易,欢迎打赏。














































































