工业数字孪生项目里,模型处理往往是第一个卡脖子的环节。你拿到甲方给的原始CAD数据,动辄几百兆甚至几个G,图层混乱、面数爆炸、材质丢失,直接拖进Unity轻则卡死,重则导入报错。我做过好几个工厂产线、制冷站、变电站的数字孪生可视化项目,几乎每个项目前期都要花大量时间在模型轻量化和格式转换上。PiXYZ Plugin就是在这个环节里救我命的东西——它能把CATIA、SolidWorks、STEP、JT这些工业格式直接吃进Unity,并且提供了一套相当完整的减面、修复、LOD生成工具链。这篇内容我打算把这两年用PiXYZ处理工业模型的实际经验完整梳理一遍,从环境配置到减面策略,从材质烘焙到批量脚本,尽量把踩过的坑和验证过的参数都讲清楚。适合正在做Unity数字孪生、工业可视化、CAD模型轻量化的朋友参考,不管你是刚接触PiXYZ还是已经用了一段时间但总觉得效果不理想,应该都能找到一些能直接用的东西。
1. 先搞清楚PiXYZ到底解决的是哪一段问题
1.1 工业模型进Unity的真实痛点
很多人以为数字孪生项目最难的是一堆传感器数据接入或者实时渲染优化,但真正做过工业场景的人都知道,模型本身才是第一道坎。工厂里用的设计软件五花八门,机械专业用SolidWorks,电气用EPLAN,土建用Revit,工艺管道可能用PDMS或者CADworx,最后给到你这边的格式可能是STEP、IGES、JT、CATIA的CATPart,甚至直接甩一个巨大的装配体。这些格式Unity原生一个都不认。
你可能会说,那用3ds Max或者Blender转一道不就行了。理论上可以,但实际操作中问题很多。第一是转换精度损失,NURBS曲面转成三角网格的时候,如果参数没调好,圆柱变成多边形棱柱,管道变成方块,甲方一看就觉得你做得粗糙。第二是层级信息丢失,工业装配体里每个零件的命名、父子关系、装配约束都是有意义的,转一道之后全变成一堆无名Mesh,后期想做单零件高亮、拆解动画、属性绑定就非常痛苦。第三是体量问题,一个中等规模的工厂装配体,三角面数轻松上千万,不经过专业减面根本跑不动。
PiXYZ Plugin的核心价值就在这一段:它直接在Unity里提供了一套工业CAD数据的导入和优化管线,不需要你离开Unity去别的软件里折腾。它支持CATIA V5/V6、NX、SolidWorks、Creo、JT、STEP、IGES、STL等主流格式,导入之后保留装配树结构,然后你可以用它的工具做减面、修复、UV展开、LOD生成、材质烘焙,最后直接输出成Unity可用的Prefab或者AssetBundle。
1.2 PiXYZ的产品线和你该选哪个
PiXYZ其实有好几个产品形态,容易搞混。最基础的是PiXYZ Studio,一个独立的桌面应用,适合做批量的模型预处理,不依赖Unity。然后是PiXYZ Plugin for Unity,这个是我们重点要讲的,直接嵌在Unity编辑器里,用C# API和编辑器面板操作。还有一个PiXYZ SDK,给需要做二次开发或者集成到自有管线里的团队用。
对于大多数Unity数字孪生项目,Plugin版本是最合适的。你可以在Unity里直接看到模型导入后的效果,边调参数边预览,不用来回切换软件。而且Plugin版本提供了完整的C# API,后期做自动化批处理非常方便。Studio版本适合那种模型量特别大、需要先在外部做一轮粗处理的场景,比如几千个零件的装配体,先在Studio里跑一遍自动减面,再进Unity做精细调整。
选版本的时候还有一个点要注意:PiXYZ的授权是分模块的。基础的导入功能是一个价位,减面、修复、LOD这些高级功能可能需要额外的授权。采购之前一定要跟销售确认清楚你的使用场景需要哪些模块,不然做到一半发现某个关键功能没授权就很尴尬。
1.3 环境准备中最容易忽略的细节
安装PiXYZ Plugin本身不复杂,从Package Manager或者Asset Store导入就行,但有几个地方特别容易出问题。
第一个是Unity版本兼容性。PiXYZ对Unity版本比较敏感,不是所有版本都支持。我实测下来,Unity 2021 LTS和2022 LTS相对稳定,2020之前的版本有些API对不上。如果你用的是Unity 6或者更新的版本,一定要先去官网查兼容性列表,别直接装。装之前建议把项目备份一下,PiXYZ导入过程中会修改一些项目设置,万一出问题回滚很麻烦。
第二个是依赖库的问题。PiXYZ底层依赖一些原生的CAD解析库,Windows平台一般没问题,Mac平台有时候会遇到动态库加载失败。如果你在Mac上开发,建议先跑一下它自带的Sample场景验证环境是否正常。
第三个是内存和显存。处理大型装配体的时候,PiXYZ会在内存里展开完整的BRep数据结构,一个500MB的STEP文件展开后可能占用3到5GB内存。建议开发机的内存至少32GB,显卡显存8GB以上。如果模型特别大,可以先用PiXYZ Studio做一轮预处理,把不需要的零件删掉再进Unity。
提示:安装完PiXYZ Plugin之后,先去Edit > Project Settings里检查一下Scripting Define Symbols有没有自动添加PiXYZ相关的宏定义。有些版本需要手动加,不加的话API调用会报编译错误。
2. 从CAD到Unity:导入流程的完整拆解
2.1 导入前的模型检查与预处理
拿到CAD文件之后不要急着往PiXYZ里拖,先做一轮检查能省很多事。我一般会看三个东西:文件格式、装配层级、单位。
文件格式方面,如果甲方能给STEP或者JT最好,这两种格式PiXYZ支持得最成熟,解析速度快,兼容性好。如果只有原生格式比如CATPart或者SLDPRT,PiXYZ也能读,但需要对应的CAD内核授权,而且解析时间会明显变长。遇到这种情况,我通常会建议甲方先导出成STEP AP214或者AP242,能省不少事。
装配层级方面,用CAD软件打开看一眼装配树,把不需要的零件记下来。比如工厂模型里的标准件、螺栓螺母、内部结构,这些在数字孪生可视化里根本看不到,导入之前删掉能大幅减少数据量。我做过一个制冷站项目,原始装配体里有大量管道法兰的螺栓,光这些螺栓就有十几万个面,删掉之后模型体积直接少了三分之一。
单位问题特别容易被忽略。CAD软件默认单位可能是毫米,而Unity的单位是米。如果导入时不注意,模型要么大得离谱要么小得看不见。PiXYZ导入面板里有一个Scale Factor选项,默认是0.001,就是把毫米转成米。但有些CAD文件本身单位就是米,这时候再用0.001就错了。我的做法是导入之后先放一个Unity默认的Cube(边长1米)在旁边对比,目测一下比例对不对,不对再调。
2.2 PiXYZ导入面板的参数详解
PiXYZ的导入面板参数不少,但常用的就那么几个。我按重要性排一下。
Tessellation Quality(曲面细分质量)这个参数决定了NURBS曲面转三角网格的精度。值越高,曲面越平滑,但面数也越多。PiXYZ提供了几个预设档位,从Draft到Precise。我的经验是,对于数字孪生可视化,Medium档位就够了,除非是特别重要的外观件需要特写。曾经有个项目我用了Precise档,结果一个圆柱面生成了上万个三角面,整个模型面数直接翻倍,后来降到Medium,视觉效果几乎没差别,面数少了40%。
Curve Quality(曲线质量)控制曲线离散化的精度,影响管道、圆角这些特征的平滑度。一般跟Tessellation Quality保持一致就行。
Import Assembly Structure(导入装配结构)这个一定要勾上。勾上之后PiXYZ会保留CAD的装配树,每个零件对应一个GameObject,父子关系跟CAD里一致。后期做零件高亮、属性查询、拆解动画都靠这个结构。如果不勾,所有零件会合并成一个Mesh,后期想单独操作某个零件就没办法了。
Import Materials(导入材质)如果CAD文件里带了材质信息,勾上这个能自动转换。但工业CAD的材质信息通常很简陋,就是几个颜色,跟Unity的PBR材质差距很大。我的做法是先勾上导入基础颜色,后期再用PiXYZ的材质工具或者手动替换成Unity的标准材质。
Import PMI(导入产品制造信息)这个看项目需求。PMI包含尺寸标注、公差、注释这些信息,数字孪生可视化一般用不到,勾上反而增加数据量。除非甲方明确要求展示这些信息,否则建议关掉。
2.3 导入后的第一轮清理
模型导入进来之后,先别急着做减面,做一轮清理能事半功倍。
第一步是检查空节点和无效Mesh。CAD装配体里经常有一些空Group或者没有几何体的零件,这些在Unity里就是空GameObject,留着占地方。可以用PiXYZ提供的API批量检测和删除。
// 批量删除没有MeshFilter或者Mesh为空的节点 using PiXYZ.Plugin; using UnityEngine; public class CleanEmptyNodes { public static void Execute(GameObject root) { var meshFilters = root.GetComponentsInChildren<MeshFilter>(true); int removed = 0; foreach (var mf in meshFilters) { if (mf.sharedMesh == null || mf.sharedMesh.vertexCount == 0) { Object.DestroyImmediate(mf.gameObject); removed++; } } Debug.Log($"清理了 {removed} 个空Mesh节点"); } }第二步是检查重复Mesh。工业装配体里大量使用标准件,同一个螺栓可能在几百个位置出现。PiXYZ导入的时候每个实例都会生成独立的Mesh数据,内存占用很大。可以用它的Instancing功能把相同的Mesh合并成实例,内存能省很多。
第三步是检查法线方向。CAD模型转过来之后法线经常是反的,表现为模型看起来发黑或者光照不对。PiXYZ有Recalculate Normals的功能,可以批量修复。如果修复之后还有问题,可能是模型本身有非流形几何,需要先做修复。
注意:清理操作建议在PiXYZ的Working Scene里做,不要直接改原始导入的Prefab。PiXYZ的工作流是导入到Working Scene,处理完之后再Bake成最终的Prefab。这样原始数据保留着,随时可以回退重新处理。
3. 减面策略:怎么在视觉无损的前提下把面数降下来
3.1 减面的本质和你该关注什么
减面不是简单地把面数砍掉,而是在保持视觉特征的前提下,用更少的三角面表达同样的形状。工业模型里有很多特征是需要保留的,比如管道的圆柱面、设备的边角、法兰的圆孔,这些如果减面减过头,视觉上会明显失真。
PiXYZ的减面算法是基于二次误差度量的,简单说就是计算每个边折叠之后对整体形状的影响,优先折叠影响小的边。它提供了几个关键参数:Target Ratio(目标比例)、Max Deviation(最大偏差)、Feature Angle(特征角度)。
Target Ratio是最直观的,你设0.5就是减到原来的一半面数。但我不建议直接按比例减,因为不同零件的复杂度不一样,统一比例会导致简单零件减过头、复杂零件减不够。更好的做法是用Max Deviation,设定一个允许的形状偏差值,让算法自己决定每个零件减到多少。比如设0.1毫米,意思是减面后的形状跟原始形状的偏差不超过0.1毫米,这样简单零件会被大幅减面,复杂零件保留更多细节。
Feature Angle控制哪些边被认为是特征边需要保留。默认30度,意思是相邻面夹角超过30度的边会被保护起来。对于工业模型,这个值可以适当调低到20度,保留更多细节。但也不能太低,太低的话减面效果会很差。
3.2 分零件类型的减面参数建议
不同类型的零件减面策略差别很大,我按经验给几组参数。
管道和圆柱体:这类零件的面数主要集中在圆周方向。减面的时候关键是保持圆周的平滑度。Feature Angle设15到20度,Max Deviation设0.05到0.1毫米。如果管道直径很大,偏差值可以适当放大。我一般会把管道的圆周面数控制在16到24段之间,低于16段看起来就明显有棱角了。
设备外壳和箱体:这类零件大多是平面和简单曲面,减面空间很大。Target Ratio可以设到0.3甚至0.2,Max Deviation设0.2毫米。关键是保留边角特征,Feature Angle设30度左右就行。
法兰和圆孔:圆孔是减面的难点,减过头孔就变成多边形了。我的做法是把圆孔单独标记出来,用较低的减面比例,或者干脆不减。PiXYZ支持按材质或者按命名规则选择性地减面,可以给圆孔类零件打上特定材质,减面的时候排除掉。
标准件和紧固件:螺栓螺母这些,如果数量多且尺寸小,直接删掉或者用一个简单的圆柱代替。没必要为了几个像素的视觉效果保留几万个面。
下面这张表是我在几个项目里总结的参数参考,实际用的时候还要根据模型尺寸和视觉要求微调。
| 零件类型 | Target Ratio | Max Deviation | Feature Angle | 备注 |
|---|---|---|---|---|
| 管道/圆柱 | 0.4-0.6 | 0.05-0.1mm | 15-20度 | 圆周至少16段 |
| 设备外壳 | 0.2-0.3 | 0.2mm | 30度 | 保留边角 |
| 法兰/圆孔 | 0.6-0.8 | 0.02mm | 10度 | 或直接排除 |
| 标准件 | 0.1-0.2 | 0.5mm | 45度 | 或直接删除 |
| 建筑结构 | 0.15-0.25 | 0.3mm | 35度 | 平面为主 |
3.3 减面后的质量验证方法
减面做完不能直接就用,得验证一下效果。我一般用三种方法。
第一种是视觉对比。在Unity里把原始模型和减面后的模型并排放在一起,用同样的相机角度和光照,截图对比。重点看圆柱面有没有变棱角、边角有没有变形、小特征有没有消失。这个方法最直观,但比较主观。
第二种是几何偏差分析。PiXYZ提供了Deviation Analysis工具,可以计算减面后模型跟原始模型的几何偏差,用颜色图显示出来。红色区域表示偏差大,蓝色表示偏差小。我一般要求关键区域的偏差不超过0.1毫米,非关键区域不超过0.5毫米。
第三种是面数和性能对比。减面前后分别看一下三角面数、顶点数、Draw Call数,以及在目标硬件上的帧率。数字孪生项目通常要求在中低端设备上也能流畅运行,所以性能验证很重要。我做过一个项目,减面前面数1200万,帧率只有8帧,减面后降到180万,帧率稳定在60帧,视觉效果几乎没差别。
提示:减面操作是不可逆的,建议在PiXYZ的Working Scene里做,处理完之后Bake成新的Prefab,原始Prefab保留着。如果减面效果不满意,可以随时回到原始模型重新调参数。
4. 材质与UV:让工业模型在Unity里好看的关键
4.1 工业CAD材质到Unity PBR的转换逻辑
CAD软件里的材质和Unity的PBR材质完全是两套体系。CAD材质通常只定义了基础颜色和简单的反射率,没有金属度、粗糙度、法线这些PBR需要的通道。PiXYZ导入的时候会尽量转换,但效果通常很一般,模型看起来灰蒙蒙的,没有质感。
我的做法是分两步走。第一步是用PiXYZ的材质转换功能把CAD材质转成Unity的标准材质,保留基础颜色。第二步是根据零件的类型手动或者批量替换成预设的PBR材质。比如管道用金属材质,设备外壳用喷涂材质,地面用混凝土材质。
PiXYZ提供了一个Material Mapping的功能,可以建立CAD材质名到Unity材质的映射表。比如CAD里叫"Steel"的材质自动映射到你做好的金属PBR材质。这个功能在零件种类多但材质种类少的时候特别有用,配一次映射表,后面所有模型都能用。
4.2 UV展开的实操要点
工业模型通常没有UV,或者UV是CAD软件自动生成的,乱七八糟没法用。做数字孪生可视化,如果只是纯色材质,没有UV也能凑合。但如果要用贴图,比如设备上的logo、警示标识、屏幕内容,就必须有合理的UV。
PiXYZ提供了自动UV展开功能,基于Angle-based的算法。操作很简单,选中模型,点Unwrap,调几个参数就行。但工业模型的UV展开有几个坑。
第一个是接缝位置。自动展开的接缝位置是算法决定的,可能在视觉上很明显的地方。比如一个圆柱形设备,接缝如果开在正面就很丑。我的做法是先用PiXYZ的Seam工具手动标记接缝位置,把接缝藏在背面或者不显眼的地方,再做展开。
第二个是UV拉伸。工业模型有很多长条形零件,比如管道、型材,自动展开的时候UV拉伸很严重。这时候需要调整UV的缩放比例,或者用Planar Projection手动展。PiXYZ支持多种投影方式,Box、Cylinder、Planar都有,根据零件形状选合适的。
第三个是UV通道。Unity的标准Shader用UV0,但Lightmap用UV1,有些特效可能用UV2。PiXYZ展开的时候可以指定输出到哪个通道。我的习惯是UV0给主贴图,UV1给Lightmap,分开处理。
4.3 材质烘焙与Lightmap的配合
数字孪生场景通常很大,实时全局光照跑不动,需要用烘焙的Lightmap。但工业模型面数多、零件多,直接烘焙Lightmap会很慢,而且效果不一定好。
我的做法是先用PiXYZ做一轮减面,把面数降下来,再做UV展开,然后烘焙。烘焙的时候有几个参数要注意。
Lightmap Resolution根据模型尺寸设,一般每米4到8个像素。太低了光影有噪点,太高了烘焙时间和显存占用都上去了。我一般设6像素每米,大部分场景够用。
Lightmap Padding设2到4个像素,防止UV接缝处出现光影渗漏。工业模型零件多,UV岛也多,Padding不够的话接缝处会有黑边。
Ambient Occlusion建议开启,能增强零件之间的阴影关系,让模型看起来更立体。PiXYZ的AO烘焙质量不错,但时间比较长,建议在最终输出前跑一次就行。
注意:如果项目要求实时渲染且不能用烘焙Lightmap,可以考虑用Unity的Enlighten或者第三方实时GI方案。但工业场景通常很大,实时GI的性能开销很难接受,还是建议用烘焙方案。
5. 批量处理与自动化:把重复劳动交给脚本
5.1 为什么必须做自动化
一个数字孪生项目通常有几十甚至上百个模型文件,每个文件都要走一遍导入、清理、减面、UV、材质、导出的流程。如果全靠手动操作,不仅效率低,而且容易出错。我做过一个项目,有80多个设备模型,手动处理了三天,后来写了个脚本,同样的工作量两个小时就跑完了。
PiXYZ提供了完整的C# API,可以在Unity编辑器里写脚本做批处理。核心的类就那么几个:PiXYZAPI负责导入导出,PiXYZ.Scene管理场景,PiXYZ.Algo提供减面、修复、UV这些算法。
5.2 一个完整的批处理脚本框架
下面这个脚本框架是我在多个项目里迭代出来的,包含了导入、清理、减面、导出四个核心步骤。你可以根据自己的需求调整参数和流程。
using System.IO; using UnityEditor; using UnityEngine; using PiXYZ.Plugin; public class PiXYZBatchProcessor { [MenuItem("PiXYZ/批量处理模型")] public static void BatchProcess() { string inputDir = "Assets/CAD_Source"; string outputDir = "Assets/Prefabs_Processed"; if (!Directory.Exists(outputDir)) Directory.CreateDirectory(outputDir); string[] cadFiles = Directory.GetFiles(inputDir, "*.*", SearchOption.AllDirectories); foreach (var file in cadFiles) { string ext = Path.GetExtension(file).ToLower(); if (ext != ".step" && ext != ".jt" && ext != ".stp" && ext != ".igs") continue; Debug.Log($"开始处理: {file}"); // 1. 导入 var importParams = new ImportParameters { tessellationQuality = TessellationQuality.Medium, importAssembly = true, importMaterials = true, scaleFactor = 0.001f }; var scene = PiXYZAPI.Import(file, importParams); // 2. 清理空节点 CleanEmptyNodes(scene); // 3. 减面 var decimateParams = new DecimateParameters { maxDeviation = 0.1f, featureAngle = 20f, targetRatio = 0.5f }; PiXYZAPI.Decimate(scene, decimateParams); // 4. 导出Prefab string prefabName = Path.GetFileNameWithoutExtension(file); string prefabPath = Path.Combine(outputDir, prefabName + ".prefab"); PiXYZAPI.ExportPrefab(scene, prefabPath); Debug.Log($"处理完成: {prefabName}"); } AssetDatabase.Refresh(); Debug.Log("批量处理全部完成"); } private static void CleanEmptyNodes(PiXYZ.Scene scene) { // 清理逻辑 } }这个框架可以根据项目需求扩展。比如加一步自动UV展开,加一步材质映射,加一步LOD生成。PiXYZ的API文档写得还算清楚,大部分功能都有示例代码。
5.3 批处理中的异常处理和日志
批处理最怕的就是跑到一半某个文件出错,整个流程中断。所以异常处理一定要做好。
我的做法是每个文件用try-catch包起来,出错的文件记录到日志里,继续处理下一个。处理完之后统一看日志,把出错的文件单独处理。
try { // 处理逻辑 } catch (System.Exception e) { Debug.LogError($"处理 {file} 时出错: {e.Message}"); errorFiles.Add(file); continue; }日志建议写到文件里,不要只输出到Console。批处理跑几个小时,Console的内容可能被冲掉。用File.AppendAllText写到一个txt文件里,方便事后排查。
还有一个经验是批处理之前先拿几个典型文件测试一下,确认参数没问题再跑全量。我有一次没测试直接跑了200个文件,跑到一半发现减面参数设错了,全部重来,浪费了大半天。
6. 性能优化:让数字孪生场景真正跑起来
6.1 LOD生成策略
LOD是数字孪生场景性能优化的核心手段。PiXYZ提供了自动LOD生成功能,可以根据减面比例生成多个层级的模型。
我的LOD策略一般是三级:LOD0是原始精度或者轻度减面,用于近距离观看;LOD1是中度减面,用于中距离;LOD2是重度减面,用于远距离。切换距离根据模型尺寸和相机FOV来定,一般LOD0到LOD1在20米左右,LOD1到LOD2在50米左右。
PiXYZ生成LOD的时候可以指定每个层级的减面比例,也可以指定目标面数。我一般用减面比例,LOD1设0.5,LOD2设0.2。但要注意,LOD2减得太狠的话,远距离看会有明显的形状变化,特别是圆柱形设备。所以LOD2的比例不要低于0.15。
6.2 Draw Call合并与批处理
工业场景里零件数量多,Draw Call很容易爆掉。Unity的静态批处理和动态批处理能解决一部分问题,但工业模型通常不满足动态批处理的条件(顶点数太多),静态批处理又会导致内存占用增加。
PiXYZ提供了一个Mesh合并的功能,可以把多个零件合并成一个Mesh,减少Draw Call。但合并之后就不能单独操作某个零件了,所以只适合那些不需要交互的零件,比如建筑结构、地面、管道支架。
我的做法是分两类处理:需要交互的零件(设备、阀门、仪表)保持独立,用GPU Instancing或者SRP Batcher优化;不需要交互的零件合并成几个大Mesh,用静态批处理。
6.3 纹理压缩与显存管理
数字孪生场景的纹理数量通常很多,如果不做压缩,显存很快就满了。Unity的纹理压缩格式选择要根据目标平台来定。PC平台用DXT5或者BC7,移动平台用ASTC。
PiXYZ导出的时候可以指定纹理格式和压缩质量。我的建议是,对于颜色贴图用BC7(质量好)或者DXT5(兼容性好),对于法线贴图用BC5,对于不需要透明通道的贴图用DXT1。
还有一个容易忽略的点是纹理尺寸。工业模型上的贴图,很多其实不需要2048x2048,512x512就够了。PiXYZ可以批量调整纹理尺寸,把不需要高分辨率的贴图降下来,显存能省不少。
提示:如果项目要发布到WebGL或者移动端,显存限制更严格,建议把纹理尺寸控制在1024以下,并且用ASTC压缩。PiXYZ的批处理脚本里可以加一步自动压缩纹理,省得手动一张张调。
7. 几个实际项目里踩过的坑
7.1 大装配体导入内存溢出
有一次处理一个化工厂的装配体,STEP文件1.2GB,直接导入Unity的时候PiXYZ报内存不足。后来查了一下,PiXYZ导入的时候会把整个BRep结构加载到内存里,1.2GB的文件展开后占了将近8GB内存。开发机是32GB内存,理论上够,但Unity本身还占了一部分,加上其他进程,就爆了。
解决办法是分块导入。先在PiXYZ Studio里把装配体按区域拆成几个子装配体,每个单独导入Unity处理,最后在Unity里拼起来。或者用PiXYZ的Streaming Import功能,它支持按需加载,不一次性把所有数据读进来。
7.2 减面后法线错乱
减面算法在折叠边的时候,有时候会导致法线方向翻转或者法线不连续。表现是模型表面出现黑斑或者光照突变。这个问题在曲面零件上特别明显。
解决办法是减面之后重新计算法线。PiXYZ有Recalculate Normals的功能,可以批量修复。如果还有问题,可能是模型本身有非流形几何,需要先用Repair工具修复几何体,再重新计算法线。
7.3 材质映射丢失
PiXYZ导入的时候,如果CAD材质名包含特殊字符或者中文,映射表可能匹配不上,导致材质丢失。表现是模型全部变成默认的灰色材质。
解决办法是在导入之前先把CAD材质名规范化,去掉特殊字符,统一用英文命名。或者在PiXYZ的材质映射表里用正则表达式匹配,兼容各种命名方式。
7.4 LOD切换时的视觉跳变
LOD切换的时候如果两个层级的模型形状差异太大,会有明显的跳变。特别是圆柱形设备,LOD2减面后圆周段数太少,切换的时候能明显看到从圆变成多边形。
解决办法是控制LOD2的减面比例,不要低于0.15,并且确保圆周方向的面数不低于12段。另外可以在LOD切换的时候加一个淡入淡出过渡,Unity的LOD Group组件支持这个功能,设置一下Fade Transition Width就行。
7.5 批处理脚本的路径问题
PiXYZ的API在处理文件路径的时候,有时候对相对路径和绝对路径的处理不一致。用相对路径的时候,如果当前工作目录变了,就会找不到文件。
解决办法是统一用绝对路径。在脚本开头把输入输出目录转成绝对路径,后面所有操作都用绝对路径。虽然麻烦一点,但能避免很多莫名其妙的错误。
string inputDir = Path.GetFullPath("Assets/CAD_Source"); string outputDir = Path.GetFullPath("Assets/Prefabs_Processed");8. 关于PiXYZ和数字孪生工作流的一些个人体会
PiXYZ这个工具,刚上手的时候会觉得参数多、流程复杂,但用熟了之后会发现它的设计逻辑是清晰的:导入、清理、优化、导出,每一步都有对应的工具和API。关键是要理解每一步在解决什么问题,而不是盲目地调参数。
我现在的标准工作流是这样的:先在PiXYZ Studio里做一轮粗处理,把不需要的零件删掉,做一次自动减面,导出成中间格式。然后在Unity里用PiXYZ Plugin做精细处理,调减面参数、展UV、配材质、生成LOD。最后用批处理脚本导出Prefab和AssetBundle。这套流程跑下来,一个中等规模的工厂模型,从原始CAD到Unity可用的优化模型,大概需要半天到一天的时间。
还有一个体会是,数字孪生项目的模型处理,沟通成本往往比技术成本高。甲方给的模型经常是设计部门随手导出的,图层混乱、单位不对、零件命名不规范。与其自己花时间猜,不如直接跟甲方要一份规范的模型,或者让他们提供装配说明。前期多花半小时沟通,后期能省好几天。
最后说一个关于工具选型的想法。PiXYZ不是唯一的选择,市面上还有Unity的CAD Importer、Autodesk的FBX Pipeline、以及一些开源的STEP解析库。PiXYZ的优势在于它跟Unity的集成度最高,API最完整,对工业格式的支持最全面。如果你的项目主要是建筑可视化,用Revit导出的FBX可能就够了。但如果是真正的工业数字孪生,涉及CATIA、NX、SolidWorks这些格式,PiXYZ目前还是最省心的方案。