做 CAM 软件的机床仿真模块,绕不开一个问题:客户给你一个机床的 STEP 总装,怎么把它变成软件里各轴能真实运动的设备模型?这篇文章把整条流程讲清楚,不涉及任何具体软件,思路对机床和机器人通用。一个前提认知:几何和运动是两回事STEP 文件(AP203/214)里装的只有 B-rep 精确几何和装配层级,工作台绕哪根轴转、能走多远这类运动信息,任何 CAD 交换格式里都没有。所以导入一台机床永远是两条数据流的汇合:几何流负责长相(STEP → 三角网格),运动学流负责动作(一份需要你自己建立的运动学描述)。理解了这一点,后面每一步在干什么就清楚了。顺便交代几个格式的分工:STEP 有精确曲面但不能直接渲染;STL 是最裸的三角面,无颜色无单位;GLB(glTF 二进制)可以理解为三维界的 JPEG,网格、材质、层级打包在一个文件里,适合做显示交换;运动学则由 URDF(机器人圈的事实标准)或自定义 JSON 承载。另外提醒一句:几何、运动学、外观是三层彼此独立的数据,来源不同的模型任何一层都可能缺失,导入模块要能检查缺哪层、从哪补。第一步:按运动部件拆分总装原则一句话:一起动的算一件。床身、立柱、固定护罩并成基座件;鞍座和它上面的丝母座并成鞍座件;工作台、T 型槽板并成工作台件。螺钉油管这类小件,跟着谁动就并给谁。这一步是纯工程判断,自动化不了,但在 CAD 里就是拖装配树的事。拆完顺手画出运动学树。注意机床和机器人的树结构不同:机器人是一条串联链(base→A1→A2→…→A6),而典型 C 型立加是双分支——刀具侧 base→主轴头(Z),工件侧 base→鞍座(Y)→工作台(X)。刀尖相对工件的坐标才是 G 代码真正驱动的量,工作台动 X 时刀尖的工件坐标是反向变化的,这是机床仿真最容易搞错的符号问题。第二步:机床零位、统一坐标系下导出把总装摆到机械零位(各轴读数为 0),然后每个运动部件保持原位、单独导出一个文件,不要用零件自己的局部原点。这样场景图里每个部件的初始变换就是单位阵,运动量直接往上叠加,实现最简单、出错概率最低。(另一种约定是 URDF 式的局部坐标系链,更规范但换算麻烦,自建时不推荐。)第三步:三角化B-rep 不能直接渲染,用 OpenCascade 的BRepMesh_IncrementalMesh(pythonocc 或 FreeCAD 脚本)按弦差离散成三角网。弦差是三角面偏离真实曲面的最大距离,是显示质量与文件体积之间唯一的旋钮:整机外观 0.2~0.5mm,仿真碰撞 0.05~0.2mm,主轴刀柄近景 0.02~0.05mm,按部件重要程度分级设置最划算。这里有个必须强调的坑:处理任何模型,第一件事是核对单位和变换层级。CAD 里机床通常是毫米,机器人 URDF 约定是米,有些网格文件靠场景节点里的缩放变换转换单位——丢掉这层变换,模型会直接放大一千倍,相机被包在模型内部,渲染出来一片空。第四步:建立运动学描述每根轴一条记录,写清父件、子件、类型(平移/旋转)、轴向量、原点、行程限位。格式随意,一份 JSON 足够:{name:X,type:prismatic,parent:saddle,child:table,origin_xyz:[0,0,0],axis:[1,0,0],limit:[-300,300],max_vel:80}关键在于这些数字从哪来,它们的来源完全不同,分三件事:轴线的位置和方向:从 B-rep 几何里量,精确。旋转轴最可靠——主轴轴承位、转台止口、耳轴轴颈都是圆柱面,而 B-rep 圆柱面的数学定义本身就带着轴线,OpenCascade 里一行gp_Cylinder.Axis()直接读出方向和轴上一点,精确到建模精度。直线轴取导轨方向,通常与全局坐标轴对齐。这一步可以自动化:扫描全部圆柱面、按轴线聚类,候选旋转轴自动浮出。五轴摇篮结构还要额外量 A、C 两轴线的交点或偏距,这是 RTCP 计算的核心参数,必须从 CAD 量取。行程限位:几何里没有,从外部文档抄。模型只是一张静态姿态的快照,行程根本不在文件里。来源按可靠度排序:机床样本规格表 → 控制器轴参数(软限位)→ 实在没有,从导轨长度减滑鞍长度反推,但只能当估计值。零位标定:确定这张快照对应各轴读数多少。拿到的总装往往是设计师保存时的随机姿态,工作台停在行程中间、摆头歪着 30° 都很常见。轴线量得再准,零位不标定,整机运动照样偏。最省事的办法是请对方把总装摆到机械零位再导出;否则就自己定义几何基准(例如主轴轴线过转台回转中心、台面水平记为 A0/C0),算出快照与基准的差角,作为初始偏置烘焙进变换链。第五步:软件里装配场景图运行时每个部件挂一个变换节点,按父子关系连成树,驱动公式只有一行:T_child Translate(origin_xyz) × Rotate(axis, q) // 旋转轴 T_child Translate(origin_xyz axis × q) // 平移轴树逐级级联就是正向运动学。刀尖在工件坐标系下的位置,用刀尖世界变换 × 工件坐标系世界变换的逆求得。换成 OpenGL、OCC、Unity、three.js,逻辑一字不差。最后:三个动作把错误全逼出来动作一,点动到极限。每根轴推到正负限位,看滑鞍会不会滑出导轨、护罩会不会穿模,行程抄错或方向定反一眼即穿。动作二,整圈旋转,看自转还是公转。这是排查旋转轴位置最灵的一招:轴线位置对了,部件绕自身中心原地自转;轴线偏了,部件拖着半径画圈公转,偏一毫米都看得见。动作三,对总账。用样本上的已知尺寸交叉校验:零位下的刀尖/法兰坐标能不能由各段结构尺寸逐项加出来、最大行程或臂展是否与样本标称吻合。总账对平,运动学基本无恙。全文压成一句话:几何管长相,运动学管动作;轴线从 B-rep 量,行程从样本抄,零位靠标定;装成场景图后,用极限位姿、整圈旋转和已知尺寸把账对平。