等距 3D 视图
比较 严格等距(方位角 45°、俯角 35.264°)与 2:1 二轴测(方位角 45°、俯角 30°)。视图高度控制正交缩放。
选择图形可使用 3D gizmo;使用平移或旋转视角工具调整相机。滚轮缩放,双指可平移或捏合缩放。还可以绘制盒子、编辑 SVG 锚点,并切换光照与样式效果。
选择“绘制盒子”,在指定 Z 平面上拖出底面;或选择“编辑 SVG 锚点”,拖动橙色环的外轮廓与孔洞锚点。“倾斜 SVG”可验证旋转后的前表面锚点编辑。多选后上下拖动共用 Gizmo 的黄色菱形,可围绕选区中心等比缩放。选择工具可框选,Shift 可从地板开始框选。选择“平移”或“旋转视角”后可直接拖动,触屏也适用;滚轮缩放,双指平移或缩放。
更多交互和样式说明
改变相机距离不会改变正交投影的比例;切换预设或调整滑块会重置相机姿态。相机手势只影响当前画布的 3D 视图,不修改 2D 源图形,也不进入撤销历史。
平移和旋转视角工具支持鼠标、触控笔及单指触摸。平移工具下按住 Shift 拖动也可旋转;滚轮以指针下的地面点为中心缩放,Shift + 滚轮平移。
点击「自动环绕」可从当前视角开始缓慢转动相机,保持当前俯角、目标点和正交视图高度。再次点击会停在当前视角;选择工具、在画布上按下或滚轮操作也会停止,以便立即手动编辑。标签页隐藏或示例移出视口时暂停,返回后继续。它可以与动态聚光灯同时预览,两种动画共用限速的帧循环,不修改文档或撤销历史。
多选 3D 图形后,选区中心只显示一个 gizmo。向上拖动黄色菱形可围绕中心等比放大,向下拖动则缩小。Mesh 尺寸、SVG Path 的 2D 缩放及挤出深度会作为一次撤销记录保存;SVG 孔洞保持完整。按 Escape 可取消预览。
拾取遵循画面中的 3D 遮挡顺序,因此立方体挡住地板时会优先选中立方体。按下 Mesh 时会优先处理 3D 命中,不会误拖动重叠的 2D 源图形;选中对象的名称会随相机移动,并始终面向屏幕。
使用「选择」工具从空白处拖动可框选 3D 图形;按住 Shift 可以从地板或其他 Mesh 上开始框选。选框按 Mesh 投影到屏幕后的范围实时更新选择,完整包围的图形才会被选中,因此小选框不会把大块地板一并选中。
选择「绘制盒子」并在画布上拖动,即可创建 3D 盒子。「编辑平面 Z」设定底面的高度,「盒子深度」设定向上延伸的厚度。四角预览始终投影在指定平面上,改变视角后也跟随指针。松手后生成可选中的 Mesh;轻点或很短的拖动不会创建图形。
选择「编辑 SVG 锚点」,可直接在前表面拖动橙色环的外轮廓或内部孔洞锚点。拖动时源 Path 与挤出 Mesh 会同步变化。点击「倾斜 SVG」为挤出图形添加 3D 旋转,然后仍可在旋转后的前表面拖动锚点;空白区域可平移、旋转相机。此示例中的其他 SVG 图元尚不能作为 Path 锚点编辑。
开启「显示标注」可以为立方体和挤出 SVG 显示引导线与屏幕朝向的标签。锚点来自实时 3D Mesh 或 Path 顶点,因此标注会跟随视角、Mesh 变换及 SVG 锚点编辑;锚点移出视口后会隐藏。编辑时可关闭标注。这一层使用 DOM/SVG 覆盖,不参与 3D 深度遮挡。
开启「分层色阶」后,立方体与挤出 SVG 的受光亮度被分为四档。分档在 3D 材质着色器完成光照和色调映射后执行,因此几何、阴影、拾取及深度顺序仍沿用原来的流程;关闭后恢复连续的 PBR 光照。unlit 材质不会应用色阶。Mesh 节点可设置 material3d.toneSteps,挤出 Path/矩形可设置 extrude3d: { toneSteps };有效值为 2–8,设为 0 或省略即关闭。
开启「显示轮廓」后,立方体和橙色 SVG 环的边缘会出现深色轮廓,包括孔洞内侧。渲染器沿屏幕方向扩张背面,并用现有 3D 深度缓冲测试,因此前景几何会遮住后方的轮廓。Mesh 节点可设置 material3d: { outlineWidth: 2, outlineColor: '#1e3264' };挤出 Path/矩形可在 extrude3d 中设置同样的字段。线宽单位是屏幕像素,范围为 0(关闭)到 8。目前仅支持自由 3D 相机下的不透明 Mesh,半透明与遮罩材质不绘制轮廓。标准 glTF 导出仍使用 PBR 材质,不能保留色阶和轮廓设置。
开启「边缘光」后,立方体和 SVG 环靠近视角边缘的可见表面会染上亮色。材质着色器根据表面法线与视线方向,在常规光照和色调映射之后计算这一效果;它会随视角旋转变化,并沿用 Mesh 原有的深度与透明度规则。这是表面高光,不会在轮廓外产生模糊光晕。Mesh 节点可设置 material3d: { rimLightStrength: 0.9, rimLightColor: '#9ad9ff' },挤出 Path/矩形可在 extrude3d 中设置相同字段。强度范围为 0(关闭)到 1;unlit 材质不会应用该效果,标准 glTF 导出也不保留它。
开启「动态聚光灯」后,暖色光会扫过立方体、SVG 环与地面。光源是普通的投影 light3d 节点:动画每帧只改变其位置和方向,Mesh 几何保持不变。默认关闭;标签页隐藏或示例移出视口时暂停,也可在低性能设备上手动关闭。运动仅用于预览,不会每帧增加撤销记录。
相机 API
api.setCamera3D({
preset: 'isometric', // 或 'dimetric-2-1'
center: [245, 180, 15],
distance: 650,
orthographicHeight: 380,
clearColor: false,
});setCamera3D 为当前画布设置专属相机,后加入的 Mesh 不会覆盖它。简单场景也可在 mesh3d 节点的 camera3d 中声明同样的配置;画布专属相机优先。预设使用 Z 向上的自由正交相机。未设置预设时,旧的联动相机行为不变。orthographicHeight 仅用于自由正交相机。
自定义工具栏可将 penbarSelected 设为 Pen.ORBIT_3D,用单指针拖动自由正交 3D 视图。Pen.HAND 仍负责平移,按住 Shift 拖动仍可旋转。联动相机和透视相机不会响应这个旋转工具。
自定义绘制手势时,可调用 api.viewport2WorldOnPlane({ x, y }, planeZ) 将视口坐标投到固定 Z 平面,再用 api.world3D2Viewport([x, y, z]) 取得覆盖层所需的视口坐标。两者使用与渲染一致的相机矩阵;若没有自由正交画布相机或输入无效,则返回 null。浏览器事件坐标需先经 api.client2Viewport 转换。
对于挤出 Path 锚点,api.pathLocal2Viewport3D(node, [x, y]) 将 Path 局部坐标投到伴随 Mesh 的前表面;api.viewport2PathLocal3D(node, { x, y }) 使用渲染相机的射线与该表面求交,再反算包含父级剪切和 3D 旋转的源图形局部坐标。伴随 Mesh 尚未就绪、源变换不可逆或视线与表面平行时返回 null。这两个方法同时适用于导入的 SVG Path 和普通 Path。可用 normalizePathCommands、collectPathControlHandles、setPathHandlePoint 和 toPathData 编辑 d;拖动中更新节点,松手时调用一次 api.record()。