地址
上海市闵行区申虹路666弄
正荣中心2号楼
手机/微信
180-1627-5139
Revit 2019新增了一个材质类型,该新增材质类似于PBR材质,带有粗糙度/Roughness、反射/Reflectance、金属度/Metalness (有金属度,但是未直接暴露在材质管理器界面中)等参数。那么在这篇文章中我们来看一下新材质控制属性有哪些变化?可以实现哪些效果?基于WebGL的BIM轻量化显示引擎需如何准确的在WebGL中还原此新外观材质?
本文分享我个人在探索Revit 2019 New Material属性时的一些发现。在此基础上尝试将Revit 2019 New Material的属性参数映射到ThreeJS MeshStandardMaterial的参数上,在WebGL中还原Revit 2019 New Material的基本显示效果。
在Revit 2019 的帮助文档中详细描述了新材质的外观资源属性的参数。 有下列9种外观资源属性控制组:
通过Revit 2019的帮助文档的官方描述,可以很全面的了解新材质的9种控制外观资源属性的控制组,以及每个控制组可以控制材质哪些显示效果,文档描述很准确但却不够直观。我们通过在revit材质编辑器中的截图直观的了解一下这9种外观资源属性是如何影响材质的外观显示的。
1.信息属性 / Information
信息属性中包含对材质实例定义的字符串描述,如实例名称、实例应用说明、实例搜索关键字。
此外观资源属性不影响新材质外观显示效果。
2.参数 / Parameters
材质的基本属性都在这个卷展栏中控制。基础颜色,颜色贴图,粗糙度等。
这是最重要最基本的外观资源属性,其中颜色、折射指数、反射、粗糙度都决定了材质最基本外观特性,且和PBR材质类型的属性高度匹配。所以,如果使用ThreeJS MeshStandardMaterial来还原显示此新材质,那么这个卷展栏中的属性是必须要实现的。
3.半透明度 / Translucency
此处的半透明度控制的不是材质的透明度,而是材质的次表面散射。
真实世界中,带有次表面散射的材质有:玉石,蜡烛,葡萄,剥了皮的橘子,人体的皮肤肌肉。这些材质被光照照射的时候光能够穿透到材质内部,但是又无法直接完全的穿透,所以光在物体内部向各个方向上散射产生了这种效果。
这是一个比较高级的显示效果,在Revit的Realistic模式下不应用此效果,在Revit的Ray Trace显示模式下可以看到效果。
4.辐射率 / Emissivity
辐射率产生的效果相当于自发光。使用了物理真实的亮度单位:cd/m²描述辐射强度。观察材质预览器中的显示效果设置此参数后,不仅仅是材质自身发光,还能真实的照亮周围环境。
这是一个比较高级的显示效果,在Revit的Realistic模式下不应用此效果,在Revit的Ray Trace显示模式下可以看到效果。
5.浮雕图案(凹凸)/ Relief Pattern(Bump)
这个属性很好理解就是描述材质表面的凹凸。这里描述凹凸的图片既能使用蓝色法线贴图,又能使用黑白灰的凹凸贴图。对于凹凸强度的控制不在浮雕图案(凹凸)的卷展栏中,而在纹理编辑器中,通过Transforms>Scale>Depth Amount修改。
6.镂空图像 / Cutout
alpha蒙版贴图,贴图上支持黑和白两种颜色,材质上对应黑色处完全透明,材质上对应白色处完全不透明。
在需要制作镂空的面板时会使用这种外观资源属性。比如:带有孔洞的铝合金吊顶扣板。
7.高级高光控件 / Advanced Highlight Controls
高级的高光效果控制选项,可以控制高光的各向异性、高光的方向、高光的颜色、衰减方式等。看上去并不像是PBR材质那种完全基于物理真实的属性控制方式。
这是一个比较高级的显示效果,很少材质效果需要使用高级高光控件表达。高级高光控件可以表达拉丝金属、天鹅绒这类高光变化复杂的材质。
8.玻璃属性 / Glazing
专门定义玻璃的材质属性。
9.分层属性 / Layered
类似于VRay中的VRayCarPaintMtl,现实生活中对应的类似材质为:珍珠、金属漆、指甲油。此材质可以设置两层材质的颜色高光效果。
举例来说,分层属性的最终显示的效果就像豪华汽车的金属漆;或是女孩子图的指甲油,底层图一层红色的指甲油,待底层红色指甲油干透后在其上再图一层半透明的指甲油,最后呈现出有光泽、层次丰富、颜色带有微妙变化的视觉效果。
这是一个比较高级的效果,在Revit的Realistic模式下不能完全显示此效果,在Revit的Ray Trace显示模式下可以看到效果。
我查看了Revit 2019自带材质库AEC Material中所有Revit实例,通过对比外观材质面板的外观资源属性的组成,可以将新材质分为5种类型,分别是:
Revit 2019 新材质的这5种分类分别由上述介绍的9种外观资源属性的来组成。下表列出了5种材质类型的所包含的外观资源属性:
# | Type | 信息属性 | 参数 | 半透明度 | 辐射率 | 浮雕图案(凹凸) | 镂空图像 | 高级高光控件 | 玻璃属性 | 分层属性 |
---|---|---|---|---|---|---|---|---|---|---|
1 | Opaque | ● | ● | ● | ● | ● | ● | ● | — | — |
2 | Metal | ● | ● | — | — | ● | ● | ● | — | — |
3 | Tranparent | ● | ● | — | — | ● | ● | ● | — | — |
4 | Glazing | ● | ● | — | — | ● | ● | ● | ● | — |
5 | Layered | ● | — | — | — | — | ● | — | — | ● |
如果将.rvt工程文件从Revit 2019中转换出来,那么转换后得到材质的JSON描述文件也能从侧面印证这点。在JSON文件中有一个“BaseSchema”属性和一个“localname”属性,这两个属性有5种值分别对应到这5种类型,并且还有一个“UIDefinition”的属性,其定义了决定材质实例外观资源属性UI面板的xml文件地址。见下表:
# | Type | JSON中localname | JSON中BaseSchema | JSON中UIDefinition |
---|---|---|---|---|
1 | Opaque | Opaque | PrismOpaqueSchema | Mats/PrismOpaque/PrismOpaqueUI.xml |
2 | Metal | Metal | PrismMetalSchema | Mats/PrismMetal/PrismMetalUI.xml |
3 | Transparent | Tranparent | PrismTransparentSchema | Mats/PrismTransparent/PrismTransparentUI.xml |
4 | Glazing | Glazing | PrismGlazingSchema | Mats/PrismGlazing/PrismGlazingUI.xml |
5 | Layered | Layered | PrismLayeredSchema | Mats/PrismLayered/PrismLayeredUI.xml |
如果使用ThreeJS MeshStandardMaterial来还原Revit 2019 New Material的外观属性,我们可以如何映射这些参数值呢? 下图是两者属性映射关系的对应表:
通过上图属性映射对应表,我们可以发现ThreeJS MeshStandardMaterial能够直接支持的属性真的很少很少,不仅如此,能够直接支持的属性也存在很多局限性。使用ThreeJS预设材质支持限制如下:
通过观察Revit自带的材质实例,对于不同类型的材质(Opaque、Metal、Transparent、Glazing、Layered),在2.参数中的属性是不同的。比如金属材质实例的2.参数中只有颜色与粗糙度;混凝土材质实例的2.参数中有颜色、粗糙度、反射。个人推测2.参数有多种变体,分别对应不同的BaseSchema的材质实例,对应关系如下表:
# | Type | JSON 中 BaseSchema | 颜色或图像 | 吸收距离 | 折射指数 | 反射 | 粗糙度 |
---|---|---|---|---|---|---|---|
1 | Opaque | PrismOpaqueSchema | ● | — | — | ● | ● |
2 | Metal | PrismMetalSchema | ● | — | — | — | ● |
3 | Transparent | PrismTransparentSchema | ● | ● | ● | — | ● |
4 | Glazing | PrismGlazingSchema | ● | — | — | — | ● |
5 | Layered | PrismLayeredSchema | — | — | — | — | — |
2.参数 中的反射/Reflectance属性是可以调整的,调整范围为0.00至0.08。这个属性控制的是非金属材质垂直查看表面时表面反射了多少光线。其实定义的就是材质菲涅尔反射的F0值。在虚幻引擎和Substance软件的PBR材质中也都是可以调整的,但是ThreeJS的MeshStandardMaterial暂时不支持调整。不能自定义此属性的影响并不大,对于绝大部分的非金属材质来说,一个固定值(0.04或者0.05)是完全没问题的。
在Revit 2019中,新材质的Metalness属性用户是不能直接控制的,所以我猜想Revit根据BaseSchema在后台定义了对应的Metalness的值,达到区分非金属材质和金属材质显示效果。对应的金属度值应该如下:
# | Type | JSON 中 BaseSchema | Metalness |
---|---|---|---|
1 | Opaque | PrismOpaqueSchema | 0 |
2 | Metal | PrismMetalSchema | 1.00 |
3 | Transparent | PrismTransparentSchema | 0 |
4 | Glazing | PrismGlazingSchema | 0 |
5 | Layered | PrismLayeredSchema | 0 |
Revit 2019新材质没有给用户提供Metalness的属性控制,可能出发点是想简化用户设置材质过程,或者直接认为用户完全没有控制金属度的必要,但是也降低了用户对材质的效果的控制力。用户无法控制Metalness的值,同样也无法上传MetalnessMap控制金属度,对于表达某些金属与非金属拼合的材质就比较麻烦了。
颜色、粗糙度、金属度,这三个是PBR材质最基础的控制属性。不允许用户控制Metalness的值还是挺奇怪的。
对于凹凸贴图的强度属性,可以在纹理编辑器中通过Depth属性控制。通过观察材质实例中的Depth属性,发现有Depth有两种类型的值,第一种是对凹凸深度的限定使用了物理真实的单位,第二种使用了非物理真实的单位。所以凹凸贴图的强度控制参数需要从纹理编辑器中获取而不是在浮雕图案(凹凸)卷展栏下。,另外一个需要考虑的问题是:如何将物理真实单位和非物理真实的单位映射到MeshStandardMaterial的bumpScale属性?
浮雕图案(凹凸)的凹凸贴图即可以使用bumpmap实现,也可以使用normalmap实现,如何判断出贴图是bumpmap还是normalmap,并准确应用到ThreeJS MeshStandardMaterial的normalMap属性和bumpMap属性中也是需要考虑的。
Revit 2019 新材质中,不仅材质的外观显示效果时符合真实世界,外观资源属性中有些单位也使用了物理真实的单位,这与Revit 2018前的老材质不同,老材质中很多强度控制都是使用0到1.0浮点数、或者0到100整数、这类百分比的控制方式。Revit 2019 new Material中物理现实单位如下:
这对参数值匹配映射到ThreeJS中产生了很大的挑战。需要考虑如何将Revit 2019新材质中的物理尺寸单位相对准确的转换到WebGL中的单位。
粗略看来,想使用ThreeJS MeshStandardMaterial来完全还原Revit 2019新材质的显示效果是完全不可能的,即使图形开发人员花大量时间去自定义shader也未必能做到。
但我个人认为也没有太大的必要纠结于此。从产品的角度上来说,基于webGL的轻量化BIM显示引擎去对标Revit带有光线追踪效果的shader是完全没有必要的,而且这也不是webGL的强项;如果webGL BIM显示引擎的目标用户不是建筑设计师,那么外观材质显示的需求是非常低的,对于结构、暖通等业务方向,基本没有对Revit模型外观材质显示的需求,相比较的话Revit着色模式比真实外观对他们更有价值。再看市场的竞品,连Autodesk自家的BIM引擎Forge对Revit外观材质属性的支持数量也不超过三分之一,可想而知,想要使用webGL完全还原Revit 2019新材质还是有一定工作量和难度的。从国内Revit用户来看,在做公司外包项目时了解到的Revit用户(国内一超大房地产商的建筑设计师)在使用Revit的时候根本不知那些高级外观参数是做什么用的,或者就从来就没用过,使用最多的还是颜色和颜色贴图。
当然作为一款优秀的BIM轻量化引擎,显示效果肯定是非常重要的一部分,通过显示效果的提升。能提高产品逼格、也能拉开与同行竞品间的差距。如果要支持Revit 2019新材质的显示,个人认为可以从两个方面考虑: