C4D程序化楼体建模方法概述—MoSpline
本篇介绍如何通过MoSpline实现程序化建模的全过程,涵盖了比较重要的应用方法和知识点。更多内容可关注【西技大神】公众号。
这两天项目上用到程序化楼体,正好也可以延续上一篇《C4D中实现无机的程序化交通矩阵》,本文介绍下如何通过字符串控制并生成楼体。
要实现程序化,离不开xpresso,以及mograph。在之前的一篇文章中介绍过《说说Mogragh中的另类——Voronoi》,今天会用到另一个Mogragh成员——MoSpline。
正题之前先介绍一下MoSpline。它的模式有三种:简单、样条和Turtle,这个Turtle就是今天的主角,Turtle的两个会用到的功能:程序化样条和克隆分组。
程序化样条
简单介绍一下上图中的字符串含义。
前提:就好比是python的main函数,他是整个动态效果的基础逻辑。
忽略语境:是一个按条件排除的功能,类似于if..else
规则:就类似于python中的自定义函数,用于main函数回溯。
那么,上图中^(90)FFFA的意思大概意义就是:旋转90度,向前走三步,然后执行A动作。其中^(90)对应的就是旋转90度,F就是在当前方向上向前一步。举个例子:
为什么F没有括号去约定前进的距离呢?
在数值的选项卡下,有相应的默认参数可以约定。在此选项卡下的参数’生长‘就是回溯A的次数。用于迭代第三个参数’规则‘中自定义的参数,这也是一个核心功能(本次用不到这项功能)。
克隆分组
然后再介绍一下本次要用到的Turtle另外一个重要的功能:克隆分组。
如果克隆的模式选择对象,并且这个对象是MoSpline,那么在投射模式上就会多出四个选项:Group1、Group2、Group3、Group4。这样就可以实现哪些模块会被克隆到指定的位置上。
通过I\J\K\L四个字符自定义克隆分组:
实现程序化楼体
接下来进入正题,要实现这个楼体的效果,需要解决的问题:
1.楼体外观的实现逻辑。
2.楼体外观的位置定位。
楼体外观逻辑
日常观察建筑外观呈常规的矩形,个别位置有外凸的造型。我们将这些造型定义为模型组件,且它的轴心在这个矩形上。就可以围合成一个楼体的外观了。先准备一些模型组件,使他们的轴心点都位于他们的底面和背面上的交线中点上,这里不再赘述。
通过上述介绍的MoSpline的两个功能,借助克隆将这些零件拷贝到特定位置上。
首先,在空白对象上新建一个用户数据标签,方便灵活的移动这些自定义的数据。并在用户数据标签上新增用户数据用于作为控制面板(注意数据类型),长边排列和短边排列为字符串类型,其他参数为整数。参数如下图:
然后,添加expresso标签并进入界面。将用户数据标签拖拽到界面并为他添加刚刚创建好的数据端口。分别添加链接列表节点到xpresso,将准备好的模型分类填入到列表中。用于分别存放I\J\K\L组中的可替换模型组件。
构建层级结构,这里利用连接的特点(子对象可以调用其他位置的物体)类似于盒子的概念。将连接放在克隆的子集,这样就可以实现模型组件即使不在克隆的子集也可以实现克隆的功能。然后通过连接指认模型组件即可,这样就可以灵活的更改指认的模型组件了。
将克隆的参数设置如下:将克隆模式改为对象,对象添加为动态样条,分布调整为对应的分组即可。
分别将各个克隆的子对象连接添加到xpresso中,连接方式如下图:
其中,GetMoSpline是通过python节点实现的字符串转化。在xpresso中添加一个python节点,并删除原有的所有端口,新建输入和输出端口如下图:
combine用于接收输入的字符串,Input1用于接收链接列表输入的模型组件。stri用于输出生成的MoSpline语句字符串,length用于统计combine中调用模块种类的数量,long是合计所有模块加起来的长度。
在代码行覆盖原有的main函数,输入:
def main() -> None:
global length
global long
global stri
long=0
dic = {'I':round(Input1.GetRad().x*200),
'J':round(Input2.GetRad().x*200),
'K':round(Input3.GetRad().x*200),
'L':round(Input4.GetRad().x*200)}
#用于存储每种类型的出现次数
dnum={}
for com in combine:
if com not in dnum:
dnum[com] = 1
else :
dnum[com] +=1
long = long + float(dic[com])
#求模块数量
length = len(combine)
#求字符串
stri = ''
for index,com in enumerate(combine):
if index==0:
stri='F('+str(int(dic[com])*0.5)+')'+ com
if index!=0 and index!=len(combine)-1:
stri = stri + 'F(' + str((dic[com]+dic[combine[index-1]])*0.5)+')' + com
if index==len(combine)-1:
stri = stri + 'F(' + str((dic[com]+dic[combine[index-1]])*0.5)+')' + com + 'F('+str(int(dic[com])*0.5)+')'
这样就可以获得MoSpline的字符串语句。
生成的MoSpline根据长度控制坐标位置,楼层通过线性克隆控制即可。
其余内容不再赘述。MoSpline的功能很强大,有机会再分享其他的用法。












































































