Composer 不支持矢量缩放,所有 SVG 导入后均被光栅化为固定尺寸位图,放大即模糊;唯一保持清晰的方法是在其 UI 上层叠加原生矢量内容并同步世界坐标系。

Composer 本身没有“矢量图层”这个概念,也不支持 SVG 或数学路径驱动的无限缩放渲染。 所有在 Composer 中显示的图形(包括导入的 SVG、AI 文件)都会被光栅化为位图纹理,一旦加载进视图,就失去矢量属性——放大后必然模糊,和 PNG 没本质区别。
为什么 Composer 里 SVG 导入后一放大就糊
Composer 的渲染管线不保留矢量指令,只消费像素数据:
- 导入 SVG 时,它调用系统级光栅化器(如 Android 的
VectorDrawable或 macOS 的 Core Graphics)生成固定尺寸的位图缓存,通常按当前视图 DPI 渲染一次,后续缩放全靠 GPU 双线性插值 - 即使原始 SVG 是 1024×1024,Composer 也可能只生成 256×256 的纹理贴图用于性能优化,你拖动缩放时只是拉伸这张图
- 没有
onDraw()或Canvas.drawPath()这类逐帧重绘机制,无法响应 scale 变化重新计算轮廓 - 导出为 PDF 或 HTML 时,若勾选了 “Rasterize all graphics”,连导出环节都主动放弃矢量保真
哪些操作看似“矢量”,实则是假象
用户常误以为以下行为代表 Composer 支持矢量缩放:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在结构树中右键零件 →
Export as SVG:这只是把当前视角下模型轮廓导出为静态 SVG 轮廓线,不是实时渲染层 - 插入
SVGAnnotation并设置scale = 2.0f:实际是把已光栅化的位图放大,非重绘;缩放值超过 1.5 后边缘明显锯齿 - 用
ImageMask套一个 SVG 图形做遮罩:遮罩纹理仍是位图,alpha 边缘无距离场,羽化/缩放都会崩
真正能保住清晰度的唯一路径
绕过 Composer 渲染层,在其 UI 容器之上叠加原生矢量内容:
- Android 端:用
TextureView+Canvas.drawPath()绘制动态 SVG 路径,通过View.setZ(10)置顶,与 Composer 视图共用同一Surface - Web 端(HTML 导出):在
composer-containerDOM 元素上层加<svg></svg>标签,用 CSSpointer-events: none透传点击,再用 JS 监听 Composer 视图变化同步更新<path d="..."></path> - 关键约束:所有矢量内容必须锚定到世界坐标系(而非屏幕像素),否则旋转/平移时会漂移;需监听
CameraPositionChanged事件做矩阵反推
真正难的不是“怎么塞进一个 SVG”,而是“怎么让这个 SVG 的坐标、缩放、裁剪始终和 Composer 内部模型对齐”。一旦模型剖切、爆炸或隐藏零件,外部矢量标注不会自动重算几何关系——这得自己写投影矩阵逆变换逻辑。

















