环球今日讯!线下业务的3D设计师提效攻略
2023-03-18 13:00:16
(相关资料图)
随着58到家在过去两年的线下业务高速发展,开店装修设计需求量激增。经历了制定SI手册和业务流程规范化培训,开店运行已经逐步成熟。 结合自身的VR临感平台,向58到家业务侧提供VR的场景效果展示,有助于对齐各方目标,在施工过程中可以更加直观的表达设计意图,为门店落地保质保量的提供支持。 通过C4D + Python,创建C4D的自动化脚本实现搭建3D场景的目的。C4D可以加载AutoCAD,并读取AutoCAD的图层信息和图块信息,以此来构建墙体和放置家具。 工作内容主要分三个部分: CAD图层和图块制作 针对不同的家具和物体都分别设置一个独立的CAD图层。并针对墙体和门窗定义有特点的图层名称,例如玻璃门定义为glassdoor、墙体定义为wall,玻璃隔墙glasswall。这样可以在后续的python环节准确地识别。 图层都定义好之后,我们根据要使用的家具尺寸规格制作家具图块。C4D可以识别CAD图块的位置和旋转信息。 C4D中使用的家具和物料的模型制作 在C4D中导入或建模,将模型名称与CAD中的图层名称对应匹配。并把制作好的模型轴心放置到模型最底部的中心点。这里需要注意轴心的朝向需要与CAD的图块朝向相匹配,否则在自动摆放的环节会出现朝向错误。 python脚本编写 在这里需要对C4D的Python API文档有一定的了解,或者借助ChatGPT帮助。 我们先缕清逻辑依次执行:读取CAD信息、构建墙体、创建门洞和窗洞、摆放门窗、摆放家具、创建灯光和相机。 按CAD图层获取图块信息根据C4D的python API,读取CAD的图层和图块信息,返回一个python字典类型数据。def getlayers(self,name=None): dic={} for layer in self.layers(mode="all"): dic[layer]=[] for obj in self.childrens(): if obj.GetLayerObject(doc)[c4d.ID_BASELIST_NAME]==layer: dic[layer].append(obj) continue if name is None: return dic return dic[name]
构建墙体轮廓识别到CAD的图层信息,根据读取到的墙体轮廓信息,创建C4D的挤压生成器,生成墙体和踢脚线。 def createWall(self,up=None): connect_wall=c4d.BaseObject(1011010) connect_wall[c4d.CONNECTOBJECT_WELD]=0 connect_wall[c4d.CONNECTOBJECT_PHONG_MODE]=3 if up is None: self.doc.InsertObject(connect_wall) else: self.doc.InsertObject(connect_wall,up) #踢脚线 extruding_foot=c4d.BaseObject(5116) extruding_foot[c4d.EXTRUDEOBJECT_EXTRUSIONOFFSET]=self.WALLFOOT extruding_foot[c4d.ID_BASELIST_NAME]=self.WALLNAME extruding_foot[c4d.ID_BASEOBJECT_ROTATION_ORDER]=5 extruding_foot[c4d.ID_BASEOBJECT_REL_ROTATION,c4d.VECTOR_X]=c4d.utils.DegToRad(-90) extruding_foot[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Y]=0 extruding_foot[c4d.CAPSANDBEVELS_CAP_ENABLE_START]=1 extruding_foot[c4d.CAPSANDBEVELS_CAP_ENABLE_END]=0 doc.InsertObject(extruding_foot,parent=connect_wall) #踢脚线上材质 wallfootmtl=self.doc.SearchMaterial("黑色氟碳漆") self.setMaterial(extruding_foot,wallfootmtl,pro=3,tile=1,seaml=1,log="") #墙体 extruding_up=c4d.BaseObject(5116) extruding_up[c4d.EXTRUDEOBJECT_EXTRUSIONOFFSET]=self.STORYHEIGHT - self.WALLFOOT extruding_up[c4d.ID_BASELIST_NAME]=self.WALLNAME extruding_up[c4d.ID_BASEOBJECT_ROTATION_ORDER]=5 extruding_up[c4d.ID_BASEOBJECT_REL_ROTATION,c4d.VECTOR_X]=c4d.utils.DegToRad(-90) extruding_up[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Y]=self.WALLFOOT extruding_up[c4d.CAPSANDBEVELS_CAP_ENABLE_START]=0 extruding_up[c4d.CAPSANDBEVELS_CAP_ENABLE_END]=1 doc.InsertObject(extruding_up,parent=connect_wall) #墙面上材质 mtl=self.doc.SearchMaterial("墙面木纹") self.setMaterial(extruding_up,mtl,pro=3,tile=1,seaml=1,log="") #墙体轮廓线条 connect_up=c4d.BaseObject(1011010) connect_up[c4d.CONNECTOBJECT_WELD]=0 connect_up[c4d.CONNECTOBJECT_PHONG_MODE]=3 connect_up[c4d.ID_BASELIST_NAME]=self.WALLSPLINENAME doc.InsertObject(connect_up,parent=extruding_up) #踢脚线轮廓线条 connect_foot=c4d.BaseObject(1011010) connect_foot[c4d.CONNECTOBJECT_WELD]=0 connect_foot[c4d.CONNECTOBJECT_PHONG_MODE]=3 connect_foot[c4d.ID_BASELIST_NAME]=self.WALLSPLINENAME doc.InsertObject(connect_foot,parent=extruding_foot) for spline in self.layersdic["wall"]: newsp_foot=spline.GetClone() newsp_foot=self.changeSpline(newsp_foot) newsp_foot[c4d.ID_LAYER_LINK]=doc.GetLayerObjectRoot().GetDown() self.doc.InsertObject(newsp_foot,parent=connect_foot) for spline in self.layersdic["wall"]: newsp_up=spline.GetClone() newsp_up=self.changeSpline(newsp_up) newsp_up[c4d.ID_LAYER_LINK]=doc.GetLayerObjectRoot().GetDown() self.doc.InsertObject(newsp_up,parent=connect_up) c4d.EventAdd() return connect_wall
创建窗洞创建一个窗户大小的方块,用于墙体布尔。使用C4D的布尔工具,对墙体模型挖洞。 创建门洞创建一个门大小的方块,用于墙体布尔。使用C4D的布尔工具,对墙体模型挖洞。def subtractWindow(self):
extruding=c4d.BaseObject(5116)
extruding[c4d.EXTRUDEOBJECT_EXTRUSIONOFFSET]=self.WINDOWUP-self.WINDOWDOWN
extruding[c4d.ID_BASELIST_NAME]=self.WINDOWNAME
extruding[c4d.ID_BASEOBJECT_ROTATION_ORDER]=5
extruding[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Y]=self.WINDOWDOWN
extruding[c4d.ID_BASEOBJECT_REL_ROTATION,c4d.VECTOR_X]=c4d.utils.DegToRad(-90)
return extruding
装配门根据CAD的图层和图块信息,将准备好的模型配置到对应位置。def subtractDoor(self):
extruding=c4d.BaseObject(5116)
extruding[c4d.EXTRUDEOBJECT_EXTRUSIONOFFSET]=self.DOORHEIGHT
extruding[c4d.ID_BASELIST_NAME]=self.DOORNAME
extruding[c4d.ID_BASEOBJECT_ROTATION_ORDER]=5
extruding[c4d.ID_BASEOBJECT_REL_ROTATION,c4d.VECTOR_X]=c4d.utils.DegToRad(-90)
return extruding
装配窗户将窗户模型匹配到窗洞位置和旋转角度,并根据窗洞的尺寸自动生成匹配宽度。def setDoors(self,hardData):
harddata=hardData.GetChildren()
for obj in harddata:
for layername,splines in self.layersdic.items():
if obj[c4d.ID_BASELIST_NAME]==layername and "door" in layername:
for spline in splines:
#获得图形坐标轮廓尺寸
pos=spline.GetAbsPos()
lenth_vec,angle_vec=self.getSplineAngle(spline)
newobj=obj.GetClone()
newobj=self.stretchModel(newobj,lenth_vec,self.DOORHEIGHT,self.DEFAULT_DOORSIZE)
newobj.SetAbsPos(c4d.Vector(pos.x,0,pos.y))
newobj.SetAbsRot(angle_vec)
self.doc.InsertObject(newobj)
c4d.EventAdd()
return True
def setWindows(self,hardData): harddata=hardData.GetChildren() for obj in harddata: for layername,splines in self.layersdic.items(): if obj[c4d.ID_BASELIST_NAME]==layername and "window" in layername: for spline in splines: lenth_vec,angle_vec=self.getSplineAngle(spline) pos=spline.GetAbsPos() if lenth_vec>300: n=int(lenth_vec/self.DEFAULT_WINDOWSIZE["window"][0]) w=lenth_vec/n connect=c4d.BaseObject(1011010) connect[c4d.CONNECTOBJECT_WELD]=0 connect[c4d.CONNECTOBJECT_PHONG_MODE]=3 connect[c4d.ID_BASELIST_NAME]=self.WINDOWMERGE doc.InsertObject(connect) newobj=self.confitWindows(obj,n,w,connect) #print(newobj) else: newobj=obj.GetClone() newobj=self.stretchModel(newobj,lenth_vec,self.DOORHEIGHT,self.DEFAULT_WINDOWSIZE) self.doc.InsertObject(newobj) newobj.SetAbsPos(c4d.Vector(pos.x,self.WINDOWDOWN,pos.y)) newobj.SetAbsRot(angle_vec) #self.GeRayCollider(cpolygon,newobj) c4d.EventAdd() return True
装配家具根据读取到的CAD图层和图块信息,将制作好的C4D家具模型复制并摆放到对应的CAD图块位置。 创建灯光在每个房间创建灯光,照亮房间。#装配单个可拉伸家具
def deformatFurniture(self,furname,hardData):
harddata=hardData.GetChildren()
for obj in harddata:
if obj[c4d.ID_BASELIST_NAME]==furname:
for spline in self.layersdic[furname]:
lenth_vec,angle_vec=self.getSplineAngle(spline)
#size=spline.GetRad()
pos=spline.GetAbsPos()
newobj=obj.GetClone()
newobj=self.stretchModel(newobj,lenth_vec,self.DEFAULT_FURNITURE[furname][1],self.DEFAULT_FURNITURE)
newobj.SetAbsPos(c4d.Vector(pos.x,0,pos.y))
angle_vec.x=-angle_vec.x
newobj.SetAbsRot(angle_vec)
self.doc.InsertObject(newobj)
c4d.EventAdd()
return True
#装配场景中的可拉伸家具
def setDeformFurn(self,hardData):
names=list(self.DEFAULT_FURNITURE.keys())
for name in names:
self.deformatFurniture(name,hardData)
return True
创建相机位置在每个房间创建一个摄像机,用于渲染全景。def CreateLight(self,pos,size):
obj=c4d.BaseObject(5102)
obj[c4d.LIGHT_TYPE]=8
obj[c4d.ID_BASEOBJECT_REL_POSITION]=c4d.Vector(pos.x,self.LIGHTHEIGHT,pos.y)
obj.SetRotationOrder(c4d.ROTATIONORDER_XYZGLOBAL)
obj[c4d.ID_BASEOBJECT_REL_ROTATION]=c4d.Vector(-1.571, 0, 0)
obj[c4d.LIGHT_AREADETAILS_SIZEX]=size.x*self.SCALE
obj[c4d.LIGHT_AREADETAILS_SIZEY]=size.y*self.SCALE
tarTag1=c4d.BaseTag(1029526)
tarTag1[c4d.LIGHTTAG_POWER]=0.3
tarTag1[c4d.OCT_LIGHTTAG_TYPE_SELECT]=1
tarTag1[c4d.LIGHTTAG_KEEP_INSTANCE_POWER]=1
tarTag1[c4d.LIGHTTAG_VISIBLE_ON_SPECULAR]=0
tarTag1[c4d.LIGHTTAG_VIS_CAM]=0
tarTag1[c4d.LIGHTTAG_VIS_SHADOW]=0
tarTag1[c4d.LIGHTTAG_VIS_GEN]=0
obj.InsertTag(tarTag1)
doc.InsertObject(obj)
c4d.EventAdd()
return obj
现在得益于ChatGPT等AI工具编写代码功能加持,通过python实现根据CAD文件搭建C4D场景,更加方便地为工作中的重复性高的内容编写脚本工具。 3D设计 陈明 逆水行舟 不进则退#设置全景相机位置
def setCamera(self,pos):
campos=c4d.Vector(pos.x,self.POSY,pos.y)
camobj=c4d.BaseObject(5103)
#camsuTag=c4d.BaseObject(5678)
camTag=c4d.BaseTag(1029524)
camTag[1439]=1
camTag[c4d.OCTANECAMERA_ENABLE_IMAGER]=1
camTag[c4d.OCT_CAMIMAGER_EN_DENOISER]=1
camTag[c4d.OCTANECAMERA_EXPOSURE]=4.0
camTag[c4d.OCTANECAMERA_HCOMPRESSION]=1.0
camTag[c4d.OCT_CAMERA_IMAGER_ORDER]=1
camTag[c4d.OCTANECAMERA_RESPONSE]=5221
camTag[c4d.OCTANECAMERA_NAT_RESPONSE]=1
camTag[c4d.OCTANECAMERA_GAMMA]=4.0
camobj[c4d.CAMERAOBJECT_SHOW]=0
camobj.InsertTag(camTag)
camobj.SetRelPos(campos)
doc.InsertObject(camobj)
c4d.EventAdd()
return camobj
扫码进群
转载时请连同下方内容一起转发
请与该公众号联系获取内容授权
长按二维码 轻松关注
微信公众号:i58UXD
58同城用户体验设计中心
标签:
- 环球今日讯!线下业务的3D设计师提效攻略
- 环球新动态:张悦然作品推荐_张悦然经典语录
- 滚动:圆规画的美丽图案视频_圆规画的美丽图案
- 新动态:集体劳动合同效力
- 天天快资讯:首都机场海关查获帝王蛾幼虫干中新社北京分社
- 天天热推荐:一出场就成功圈粉!
- 天天观焦点:业务招待费占收入比例为多少时最合理_业务招待费占收入比例
- 【全球热闻】国金证券:“文心一言”发布 国内应用预计加速
- 全球热资讯!襄城县法治政府建设领导小组到农业农村局调研行政执法工作
- 【环球热闻】3月17日数字货币板块涨幅达3%
- 每日速看!沪深股通|天顺风能3月16日获外资买入0.07%股份
- 环球新资讯:滕哈赫:佩利斯特里能获得机会很好,我们不仅要依靠11位主力
- 全球快资讯:96万人次收看第一期石榴云问政网络直播
- 【天天时快讯】国庆节简笔画_国庆节简笔画
- 全球视讯!家长粗心错漏学校通知,女孩失联急坏家人
- 焦点简讯:安徽巢湖:应急救护进军营 役前训练强本领
- 【世界独家】快手在浙江成立新公司 注册资本1亿
- 焦点快看:吸收热是什么意思_xsr是什么意思
- 【全球热闻】流感患者得白肺的比利较低 儿童感染甲流以后绝大多数是轻症(今日/头条)
- 全球关注:总比分2-6遭淘汰,利物浦遭遇队史欧冠淘汰赛最惨痛的总比分失利
- 快报:天龙八部2
- 全球要闻:3·15晚会丨景区高空项目,安全带“不安全”?!“三点式安全带”或有脱落风险
- 每日视讯:山东高速服务区管理有限公司京台路曲阜分公司
- 环球观点:10-15万买什么车好_10-15万左右买什么车大家给个参考
- 每日热闻!工伤期间工资是由谁来发放
- 世界快报:首宗房屋腾空验收完成!晋江市区这里征迁全面加速中……
- 信息:全球 SUV 销量冠军!全系标配 7 个安全气囊!家用选它不会出错!
- 今日聚焦!郯城将升级改造两处休闲娱乐、网红打卡地
- 环球观焦点:景津装备(603279):3月14日北向资金增持15.09万股
- 环球讯息:猫鼬和强效敏捷药剂差多少_猫鼬和强效敏捷
x
广告
- 《高山清渠》播出过半 李健用真实形象诠释黄大发的奋斗轨迹
- 现实题材电视剧《分界线》8月1日播出 何冰张国强强手过招
- 花篮的花儿香!民族歌剧《唱响南泥湾》在保利剧院迎来首演
- 韩国电信公布未来五年非基础设施投资预算拨出12万亿韩元
- 冰墩墩设计者给北京四中学生回信:祝福可爱奋进的中国少
- 江苏南通发现1人检测结果呈阳性 系外地返通人员
- 湖南郴州报告2例香港返湘人员新冠肺炎确诊病例
- 广西百色疫情社区传播链基本阻断
- 广西新增1例本土确诊病例 本轮本土疫情累计报告确诊病例
- 葫芦岛市两医院不再收治非绥中地区患者 就医患者闭环管理
- 苏州14日新增本土确诊1例,无症状感染者3例 详情及轨迹公布
- 2021年北京空气质量创历史最优 首次全面达标
x
广告