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

用户头像
北京/设计爱好者/3年前/240浏览
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
举报
|
5
分享
相关推荐
评论
用户头像
评论你的想法~
表情
喜欢TA的作品吗?喜欢就快来夸夸TA吧!
推荐素材
三维渲染的简约简洁极简风格几何体场景海报
三维抽象矢量星球,寓意全球化、国际化,球形世界地图
红色喜庆风格的三维产品展台
扁平化抽象几何三维模型创意时尚海报
创意弹簧与小球 弹性的概念物体 三维渲染
灰色三角四面体、点线链接构成三维空间科技矢量背景
三维抽象矢量星球,寓意全球化、国际化,球形世界地图,点和线连接的矢量背景
三维渲染的老年医生
三维假期旅行主题
黑暗房间内的圆柱展台,三维渲染
三维户型剖面图
三维上海城市天际线
抽象紫色发光气球背景,三维渲染
三维卡通医生
多彩三维创意散落的旋转球体
柯基狗三维插画
红色三维概念礼盒背景
三维渲染抽象扭曲背景
三维渲染的平铺在薄荷绿背景上的易拉罐饮料静物
三维渲染的简约极简简洁紫色风格海报背景
连接的锁链与方块背景,三维渲染
三维渲染炫彩背景
实验室三维场景
三维渲染红色礼盒
三维曲线空间背景
你可能喜欢
相关收藏夹
地产VI
地产VI
地产VI
地产VI
大家都在看
登录注册