Journal

Direct Manipulation of Procedural Implicit Surfaces

Marzia Riso, Élie Michel, Axel Paris, Valentin Deschaintre, Mathieu Gaillard, Fabio Pellacini

Sapienza University of Rome; Adobe; University of Modena and Reggio Emilia

一句话总结

针对程序化隐式曲面难以直接编辑的问题,本文提出一种”视口内直接拖拽”的方法:通过为隐式函数增广出一个能唯一标识空间点身份的”协参数(co-parameter)”,再借助自动微分求出点位置对程序化参数的雅可比,从而把用户的鼠标笔画直接反解成对数十个程序化参数的更新,替代逐个拉滑条的繁琐流程。

研究背景

程序化隐式曲面(如 BlobTree、解析 SDF)用场景图(scene graph)把基元(球、盒、圆环等)与算子(布尔、光滑布尔、仿射变换、扭曲变形等)层级组合起来,是形状建模中很受欢迎的表示。它天然支持复杂几何操作与拓扑变化,但可编辑性一直是痛点:形状定义纯粹是隐式的,无法直接操控。

传统做法是把节点参数暴露成一堆抽象滑条,让用户逐个调节。这带来两个问题:一是用户必须理解每个参数对模型的影响(一个参数可能影响多个部位),二是编辑一个部位往往需要联动调整多个相互依赖的参数,过程冗长且不直观。

网格类参数化建模已有直接操控的成功方案(如 Michel and Boubekeur 2021、Gaillard 2022、Cascaval 2022),但它们都依赖网格提供的显式参数化来追踪曲面上某个点。隐式曲面缺乏曲面参数化,参数变化后无法追踪”语义上同一个点”,因此这些方法无法直接迁移。这正是本文要解决的核心难点。

方法

整体框架

给定一个描述隐式曲面的场景图,方法分三步(见流程图):

flowchart LR
    A[场景图<br/>基元+算子] --> B[编译为增广隐式函数<br/>f-bar: R3 x Θ → R x C]
    B --> C[协参数 c 标识点身份]
    C --> D[自动微分求雅可比<br/>∂p/∂θ]
    E[鼠标拖拽 ΔT<br/>+ 多点约束] --> F[梯度下降求解器]
    D --> F
    F --> G[更新程序化参数 θ]
    G --> H[球体追踪重渲染]

形式化地,一次编辑就是用户在曲面上选若干点 \(p_i\) 并给出它们期望的屏幕空间位移 \(\Delta T_i\)(位移为零则表示”该处保持不动”的约束)。求解器要更新参数 \(\theta\) 使形状匹配用户意图,同时保持它仍是程序化形状 \(\Phi(\theta)\) 的一个合法实例。优化的每点损失为:

\[L_i := \tfrac{1}{2}\left\| \Delta \mathrm{Proj}(p_i) - \Delta T_i \right\|_2^2\]

其中 \(\Delta \mathrm{Proj}(p) = \mathrm{Proj}(p_{\theta+\Delta\theta}) - \mathrm{Proj}(p_\theta)\) 是点在参数更新后投影到屏幕上的实际位移。

关键设计一:协参数(co-parameterization)

隐式函数 \(f(p,\theta)\) 只输出到曲面的标量距离 \(s\),无法在参数变化后判断”这还是不是原来那个点”。作者提出增广隐式函数 \(\bar f:(p,\theta)\mapsto(s,c)\),额外输出一个协参数 \(c\in C\) 唯一标识该位置在实例 \(\Phi(\theta)\) 中扮演的角色。其定义性质是:

\[\bar f(p,\theta) = \bar f(p',\theta') \iff p,p' \text{ 在不同参数下是同一几何元素}\]

于是拖拽后的新位置由 \(\bar f(p_{\theta+\Delta\theta},\theta+\Delta\theta)=\bar f(p_\theta,\theta)\) 唯一确定。协参数空间取 \(C = \mathbb{R}^3\times\mathbb{N}\),即 \(c=(a,\ pid)\):可微部分 \(a\)(例如把点映射回基元的规范空间坐标)+ 路径索引 \(pid\)(标识该点在场景图中经过的求值路径)。

关键设计二:增广的 eval / pre / post 编译

场景图编译时,每个基元提供 eval(位置→标量),每个算子提供 pre(准备喂给子节点的位置)与 post(归约子节点返回值)。作者只需为每种基元/算子各写一次增广版本:

\[\mathrm{eval}: \mathbb{R}^3 \to \mathbb{R}\times C, \quad \mathrm{pre}: \mathbb{R}^3 \to \mathbb{R}^{3m}\ (\text{不变}), \quad \mathrm{post}: (\mathbb{R}\times C)^m \to \mathbb{R}\times C\]

编译算法(递归 \(n.\mathrm{post}\circ \mathrm{map}(\text{Compile},\text{children})\circ n.\mathrm{pre}\))保持不变,就能同时算出距离与协参数。基元的 \(pid\) 恒为 0;对于会合并输入或复制几何的多输入算子,通过 \(pid\) 偏移(2 输入算子把第二输入的 \(pid\) 加上”第一输入最大 \(pid\) + 1”)避免多点共享协参数产生歧义。全文支持 29 种节点类型。

关键设计三:雅可比评估、归一化与过滤,及求解

由隐式函数定理,位置对参数的雅可比可由 \(\bar f\) 的雅可比得到:

\[\frac{\partial p}{\partial \theta} = -\left(\frac{\partial \bar f}{\partial p}\right)^{+}\cdot \frac{\partial \bar f}{\partial \theta}\]

其中 \((\cdot)^+\) 为伪逆,整体用自动微分求得。为解决不同参数量纲/尺度不一致,作者从六个规范视角随机采样 50 条光线,用每个参数对应雅可比列的最大幅值作归一化因子 \(m_i\)。为提升鲁棒性,在鼠标光标周围的屏幕空间圆盘内采样 16 个点求平均雅可比 \(J(p,\theta)\),并做列过滤:每个列 \(j_i\) 需至少满足三条中的两条——归一化幅值 \(\|j_i\|/m_i > \lambda_{mag}=0.35\)、跨点标准差 \(< \lambda_{std}=0.2\)、与视线方向夹角项 \(< \lambda_{view}=0.4\),从而只保留真正相关的参数。

求解阶段每帧做若干步梯度下降,最小化多点损失(含正则项 \(L_{reg}=\|\Delta\theta\|^2,\ \lambda=0.2\)):

\[L = \sum_i L_i + \lambda L_{reg}\]

更新规则(梯度按归一化因子逐分量缩放):

\[\Delta\theta := -\eta\, \nabla L / m, \quad \theta \leftarrow \theta + \Delta\theta, \quad p_i \leftarrow p_i + J(p_i,\theta)\cdot\Delta\theta\]

当协参数漂移 \(\|\Delta c\|\) 超过阈值 \(e_c=0.7\) 时,用其缩小梯度以抑制点身份漂移。

实验结果

方法用 C++/GLSL 实现,以 libfive 树作为编译目标(提供符号优化与自动微分),球体追踪渲染,运行于 AMD Ryzen 5 + NVIDIA GTX 1050。在 11 个复杂度各异的程序化隐式模型上测试,节点数 19~265、参数量 4~45,全流程交互式帧率运行;梯度下降最多 50 步,雅可比每 4 帧更新一次。各步骤耗时(毫秒)如下:

场景 参数数 #θ 编辑参数 #θe 节点数 协参采样 tc 雅可比 tj 求解 ts
Roller 8 1 265 1.524 2.365 9.903
Cup 5 3 39 2.523 0.151 0.548
Fridge 3 1 19 2.325 0.214 0.381
Sofa 13 1 77 2.319 0.678 1.652
Webcam 5 1 206 1.628 0.935 3.503
Cheese 27 2 158 1.897 1.932 3.145
Robot Arm 6 1 243 2.061 0.732 2.831
Pipes 6 2 249 1.559 1.510 4.152
Toaster 4 1 256 1.904 1.126 4.811
House 20 4 244 2.137 0.999 2.313
Rabbit 45 5 188 1.484 3.980 5.928

与 libfive 的直接操控方案对比:libfive 只保证曲面经过新鼠标位置(沿法向回投影),无法识别用户想改哪个部位,对切向运动表现差;本文方法因为追踪了点身份,能在相机镜头位置、开口高度等切向编辑中正确映射参数(libfive 则误改深度)。方法还天然支持 CSG 引起的拓扑变化(靠 \(pid\) 保证点追踪),并支持光滑布尔的平滑度参数编辑。

用户研究(20 名背景各异的被试,5 个”照参考图达到目标”任务):95% 认为工具对输入响应灵敏,55% 表示很少/从不更偏好滑条;100 次测试中仅 8 次未达成目标(多发生在含变形的模型上);多数用户更偏好直接操控,全部被试表示若换新场景仍愿用直接操控。主要抱怨是”有时多个参数同时变化、难以隔离想调的那个”。

亮点与局限

亮点:

  • 用”增广隐式函数 + 协参数”优雅解决了隐式曲面缺乏参数化、无法追踪点身份的根本难题,且协参数随隐式函数自动编译构建,每种节点只需写一次。
  • 借助隐式函数定理 + 自动微分求雅可比,把用户鼠标笔画直接反解为几十个参数的联动更新,交互式帧率,且天然兼容拓扑变化与光滑布尔等复杂算子。
  • 雅可比归一化与自动过滤机制无需用户干预,缓解了”一次编辑牵动多参数”的歧义;多点约束进一步增强表达力。

局限:

  • 每种基元/算子都需人工推导可注入的协参数,且要求协参数保持单射,某些边界情形不满足(例如盒子尺寸变为 0 时多点重合)。
  • 不支持域重复(domain repetition)算子(需为每个实例产生不同 \(pid\))与形状 morph 算子(协参数插值不一致);也不支持本质离散的参数(如在两种完全不同基元间切换的”基元类型”)。
  • 当过多参数影响同一区域时雅可比过滤效果下降,需靠多点固定约束缓解;当前梯度下降可换用 ADAM 或自然梯度下降进一步改进。

延伸思考

这项工作的核心洞见——”为纯隐式表示附加一个可微、可追踪的身份标签”——可能比直接操控本身用途更广。作者也指出,评估参数对每个点的局部影响这一能力,可用于直接操控之外的其他优化流水线,例如逆向程序化参数估计、形状匹配或可微渲染下的拟合。

协参数思想与近年神经隐式场(neural SDF)的可编辑性研究形成有趣对照:本文依赖场景图的显式语义结构来构造身份标签,而神经隐式场缺乏这种结构化语义,如何为其定义类似的可追踪协参数是一个开放问题。此外,用户反馈中”难以隔离目标参数”的痛点,指向了更智能的参数降维/意图推断方向,或许可结合学习式先验来预测用户最可能想改的参数子集。