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

用户头像
北京/设计爱好者/2年前/237浏览
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吧!
加载中
推荐素材
三维假期旅行主题
空中随机分布的蓝色方块,三维渲染
双十一双十二购物节三维展台背景
三维渲染红色礼盒
黑暗房间内的金属方块展台,三维渲染
三维渲染极简北欧风现代家居装饰场景
三维金融创意股票基金金融模型
夜晚复古风格小镇街道边的贩卖机,三维渲染
三维蓝色正面抽象城市天际线高级感背景
三维渲染城市背景
灰色三角四面体、点线链接构成三维空间科技矢量背景
矢量抽象三维几何图形创意海报
三维抽象矢量星球,寓意全球化、国际化,球形世界地图,点和线连接的矢量背景
三维渲染炫彩背景
矩阵立方体三维空间科技背景
三维上海城市天际线
三维界面科学技术,科幻场景矢量背景图。
三维曲线空间背景
深蓝色三维科技地球,全球化、国际化、科学技术概念抽象图形
3D三维玻璃蓝色螺旋弯曲图像背景
扁平化抽象几何三维模型创意时尚海报
三维渲染的年轻女医生
三维户型剖面图
点线连接的科技矢量背景,三维抽象矢量星球,寓意全球化、国际化,球形世界地图
三维地形图,等高线。抽象的点线科技背景,类似云端数据连接、区块链、神经网络的概念。
你可能喜欢
相关收藏夹
大家都在看
登录注册