C4D程序化楼体建模方法概述MoSpline(二)

北京/设计爱好者/2年前/181浏览
C4D程序化楼体建模方法概述MoSpline(二)

关注【西技大神】微信公众号,后台留言【10010】,即可获得工程下载链接。

之前聊过参数化楼体,是利用MoSpline和MoGraph的特性生成楼体,感兴趣可以浏览下《C4D程序化楼体建模方法概述—MoSpline》这篇文章。

今天,我在之前的基础上做了些改变,使它能够生成异型的楼体外观。仍然是借助MoSpline和MoGraph的特性,实际上这代替了C4D中没有添加点属性的方法。

  【下载方式】  

关注【西技大神】微信公众号,后台留言【10010】,即可获得工程下载链接。

【实现方法和思路】

仍然是通过字符串,字符串中每个字母都代替一个模型模块。并在之前基础上增加了每面墙体的夹角α,用逗号隔开。例如:

描述字符串中:

KJLIJKJLIJKJLIJKJLIJ,90,KKIKK,90,KJJIJKJJIJKJJIJKJJIJ,90,KKIKK

数字代表夹角度数,正数代表顺时针旋转,负数代表逆时针旋转。大写字母字符串代表这面墙上使用的模型模块。

生成的模型结果:

实现方法:

1.利用xpresso将所需的关联对象绑定,并创建GUI。

2.自定义xpresso中的python节点,将输入的字符串翻译成MoSpline的语句。这样,可以实现很多异型的建筑轮廓。

【创建GUI和绑定Xpresso】

按照上文的配图,新建一个用户数据标签并创建用户数据参数。

按下图链接:IJKL分别代表四种尺寸规格的模型列表的序号,连接到链接列表。

用于检索链接列表中的模型使用。然后分别作为输入端连接到python节点。

然后:

(1)创建矩阵,使矩阵克隆到MoSpline的顶点上,并为矩阵添加简易效果器偏移顶点位置以便于匹配到楼体的顶部。

(2)将简易效果器的偏移打开,并用xpresso标签绑定到用户数据的楼层数变量,添加匹配关系为层高*楼层数上,这里层高我设为300cm。

(3)创建追踪对象,将矩阵添加到追踪对象中并设置模式为连接元素,开启下方的闭合线条。

这样我们得到了楼体的动态轮廓。以此类推,分别创建楼顶楼板、楼顶造型轮廓、楼顶女儿墙轮廓。

利用挤压生成器和扫描,即可创建动态的模型体。

  【自定义python节点】  

在今天的文章中,利用一个MoSpline围合成一个封闭样条线,实现异型楼体。此节点将输入的字符串转换成MoSpline的语句。

(1)在新建的python节点中,新建输入和输出端口,分别设置名称和数据类型。

这里需要注意,端口名称将在节点的python代码中作为变量名所以要使用英文。

同时注意将变量声明为global变量。

(2)分别自定义函数来实现具体功能

将我们输入的字符串texts拆解为字符串和夹角α。

#拆解输入字符串
def change(texts,dic):
new_texts=texts.split(',')
stris = new_texts[::2]
angles = new_texts[1::2]
new_stris = []
new_angles = []
for stri in stris:
n = str_bond(stri,dic)
new_stris.append(n)
for an in angles:
m = angle(an)
new_angles.append(m)
return new_stris,new_angles,len(new_texts)

dic代表我们input的模型尺寸信息和模型对象:这里乘以的200是因为我导入的模型单位与C4D不一致和GetRad()获得的是半径,匹配C4D的尺寸。

dic = {'I':[round(Input1.GetRad().x*200),idx1],
   'J':[round(Input2.GetRad().x*200),idx2],
   'K':[round(Input3.GetRad().x*200),idx3],
   'L':[round(Input4.GetRad().x*200),idx4]}

(3)接下来是将拆解好的字符串列表和夹角α列表中的信息翻译成MoSpline语句的函数:关于MoSpline的语法可以参考C4D的官方文档了解。

#模块部分字符串转化为MoSpline字符串
def str_bond(combine,dic):
stri = ''
for index,com in enumerate(combine):
if index==0:
stri='F('+str(int(dic[com][0])*0.5)+')'+ com + '(' + str(dic[com][1]) + ')'
if index!=0 and index!=len(combine)-1:
stri = stri + 'F(' + str((dic[com][0]+dic[combine[index-1]][0])*0.5)+')' + com + '(' + str(dic[com][1]) + ')'
if index==len(combine)-1:
stri = stri + 'F(' + str((dic[com][0]+dic[combine[index-1]][0])*0.5)+')' + com + '(' + str(dic[com][1]) + ')' + 'F('+str(int(dic[com][0])*0.5)+')'
return stri


#角度部分字符串转化为MoSpline字符串
def angle(combine):
stri = ''
if float(combine)>=0:
return '+(' + str(abs(float(combine))) + ')'
else:
return '-(' + str(abs(float(combine))) + ')'

(4)写一个将翻译好的两组字符串合并到一起形成一个完整语句的函数:

#合并模块和角度字符串
def bond_all(stris,angles):
string = ''
stris_num = len(stris)
angles_num = len(angles)
for i in range(min(stris_num,angles_num)):
string = string + stris[i]
string = string + angles[i]
if stris_num > angles_num:
string = string + stris[-1]
elif stris_num < angles_num:
string = string + angles[-1]
else:
pass
return string

(5)最后,在主函数main()中将逻辑写清楚:

def main() -> None:
    global stri
dic = {'I':[round(Input1.GetRad().x*200),idx1],
           'J':[round(Input2.GetRad().x*200),idx2],
           'K':[round(Input3.GetRad().x*200),idx3],
           'L':[round(Input4.GetRad().x*200),idx4]}
#拆解字符串
stris,angles,count = change(texts,dic)
#求字符串
stri = bond_all(stris,angles)

自定义python节点就可以了,将输出的字符串给到MoSpline就可以生成一个想要的楼体轮廓了。

其他的GUI数据绑定都比较常用,这里不再赘述。

2
Report
|
5
Share
相关推荐
评论
in to comment
Add emoji
喜欢TA的作品吗?喜欢就快来夸夸TA吧!
推荐素材
You may like
MOVA 扫地机器人-活水版
Homepage recommendation
相关收藏夹
教程
教程
教程
教程
作品收藏夹
教程1
教程1
教程1
教程1
作品收藏夹
ip形象设计+表情包
ip形象设计+表情包
ip形象设计+表情包
ip形象设计+表情包
精选收藏夹
作品收藏夹
企业展厅/文化墙 参考
企业展厅/文化墙 参考
企业展厅/文化墙 参考
企业展厅/文化墙 参考
精选收藏夹
作品收藏夹
小家电
小家电
小家电
小家电
精选收藏夹
作品收藏夹
企业展厅
企业展厅
企业展厅
企业展厅
精选收藏夹
作品收藏夹
大家都在看
Log in