Skip to content

EmbroiderSnow/arap-web-deformer

Repository files navigation

Web-ARAP-deformer


运行方式

npm install antd @ant-design/icons three @react-three/fiber @react-three/drei
npm run dev

然后打开浏览器访问localhost:5173


在观察模式下,可以观察模型,使用gizmo实现三轴旋转

在选择模式下,Ctrl+鼠标左键点击模型上的点可以选择锚定点,Alt+左键点击选择约束点

在变形模式下,拖动约束点进行变形


注意

由于交互方式比较简单,所以选择锚定点和约束点需要一些技巧(以下内容来自LLM,仅供参考)

核心目标:通过手动选择的点,为变形提供充分、均衡且无冲突的几何约束,确保线性系统稳定且能反映用户意图。

1. 锚点 (固定点) 的选择技巧:

    数量是基础:

        绝对最小值: 至少需要 3个非共线的固定锚点 来固定模型的旋转和平移自由度。如果只有1个或2个固定点,模型会绕点旋转或沿固定点连线滑动/旋转,导致系统欠约束,极易崩溃。

        实际需求: 3点只是全局固定,对于局部变形稳定性和形状保持远远不够! 你需要显著多于变形点数量的固定锚点,并且它们必须分布在需要保持形状的关键区域。经验上,固定锚点的数量应该与变形区域的复杂度和期望的保形强度成正比。

    分布是关键:

        包围变形区域: 固定锚点必须充分包围住你打算变形的区域。想象变形区域是一个“孤岛”,固定锚点就是稳固的“海岸线”。如果“海岸线”缺口太大,“孤岛”就会在变形中漂移、扭曲甚至沉没(崩溃)。

        覆盖关键特征: 在模型需要刚性保持的部分(如角色的躯干、机械的底座、家具的腿)以及变形区域的边界(如手臂连接肩膀的环、洞口边缘)密集放置固定锚点。这些地方是抵抗变形的“要塞”。

        相对均匀: 在整个模型上(尤其是远离变形点的区域),固定锚点应保持相对均匀的分布。避免在某个方向(如X轴)上约束点密集,而在垂直方向(如Y轴)上稀疏,这会导致系统在该方向上约束不足,引起病态。

        避免“孤岛”中的固定点: 不要在计划大范围变形的区域内部零星放置固定点,除非你有特殊目的(如钉住某个局部)。这会造成剧烈的局部扭曲,并可能将问题传播开。

    几何构型:

        绝对避免共线: 所有固定锚点绝不能近似位于一条直线上!否则系统在垂直于该直线的方向上完全缺乏约束,崩溃几乎是必然的。

        尽量避免共面: 如果所有固定锚点近似位于一个平面上(例如都在模型的底部平面上),那么系统在垂直于该平面的方向(法线方向)上约束会非常弱。虽然可能不会像共线那样完全崩溃,但会导致模型在该方向上发生不期望的拉伸、压缩或扭曲。理想情况是固定锚点分布在三维空间中(例如模型的底部、顶部和一些侧面)。

    选择位置:

        高曲率/特征点: 优先选择网格上的角点、脊线、边界上的顶点。这些点对定义形状更为关键。

        拓扑关键点: 选择顶点度数较高(连接边较多)的顶点,它们通常是网格的“枢纽”。

        对称点: 如果模型对称,确保在对称位置选择对应的固定锚点,以保持对称性。

2. 移动点/手柄 (目标点) 的选择技巧:

    清晰定义目标: 明确你要移动的是模型的哪个具体部位(如指尖、鼻子尖、桌角)。选择该部位最具代表性的顶点作为移动点。

    避免孤立: 移动点不能是“孤岛”。它必须通过一条相对直接的路径(在网格上)连接到固定锚点区域,并且这条路径上最好有足够的约束(固定锚点或后续提到的引导点)来传递变形信息。如果移动点和固定点之间隔着大片无约束区域,变形会变得不稳定且不可预测。

    数量与分布 (对于复杂变形):

        单个移动点: 适合简单的平移、拉伸(如拉长一个触角)。

        多个移动点: 对于复杂变形(如弯曲手臂、扭曲身体),需要选择多个移动点来定义目标形状。例如弯曲手臂时,至少需要选择手腕点作为主要移动点,可能还需要选择肘部点作为次级移动点或引导点(见下一点)。

        引导点: 在主要移动点和固定锚点区域之间的关键位置(如关节、形状过渡区)额外选择一些顶点作为移动点或具有较弱目标位置的约束点。这可以引导变形沿着期望的路径发生,防止中间区域过度扭曲或折叠。例如,弯曲手臂时,在肘关节附近添加一个引导点并稍微移动它,可以控制弯曲的弧度更自然。

    目标位置合理性: 移动点的新位置不能过于极端(例如瞬间移动到离固定点非常遥远的位置),这会给系统带来巨大的求解压力,可能导致数值不稳定或物理上不合理的变形(如过度压缩/拉伸)。渐进式移动通常更稳定。

3. 通用约束点 (固定点 + 移动点 + 引导点) 的综合技巧:

    “刚柔边界”强化: 变形区域和保持形状区域的交界处是重中之重! 务必在这个边界环上放置一圈或多圈密集的约束点(主要是固定点)。这就像在布料边缘缝上一条加固带,防止变形向刚性区域渗透或导致边界崩溃。

    层级约束: 想象约束强度从核心固定区域到移动点逐渐减弱。在核心刚性区密集固定点,在刚性区边缘稍少但仍固定,在变形区靠近固定区的地方可以有一些弱约束或引导点,最后才是主要的移动点。

    对称性: 如果模型对称且期望对称变形,务必在对称位置选择对称的约束点(固定点和移动点),并施加对称的目标位置。

    可视化与诊断:

        高亮显示: 清晰区分固定点(如红色)、移动点(如绿色)、引导点(如黄色)。

        检查分布: 拖动前,务必肉眼检查约束点的空间分布:

            是否覆盖了所有关键刚性区域和边界?

            是否相对均匀?(非变形区也要有)

            是否存在大片空白区域?特别是移动点到固定点之间的区域。

            是否存在明显的共线或共面倾向?

        观察崩溃模式: 如果变形崩溃了,仔细观察崩溃发生在哪里:

            在移动点和固定点之间大片区域崩溃? -> 典型的约束不足,需要在该区域(特别是路径上)添加更多固定点或引导点。

            在移动点附近剧烈扭曲崩溃? -> 可能是移动点周围缺乏固定点/引导点来维持局部形状,或者移动点本身是孤立的。尝试在移动点附近添加一些固定点或引导点。

            整个模型沿某个方向塌陷/拉伸? -> 极有可能是固定点共面(塌陷方向是面的法线方向)或共线(塌陷方向是垂直于线的平面)。检查固定点几何构型,在缺失约束的方向上添加固定点。

    迭代调整: 手动选点通常不是一次完成的。看到不理想变形后,需要根据崩溃或扭曲的模式,动态地添加或移除约束点,然后重新求解。这是一个调试过程。

    最少必要原则 (但需足够): 目标是使用最少数量的约束点达到期望的稳定变形效果。过多的约束点会增加计算负担,并可能使变形过于僵硬。但“最少”的前提是“足够”。在稳定性和效率之间,优先保证稳定性(足够的约束)。

总结关键口诀:

    固定点要多(远多于移动点),分布要广(覆盖关键区域和整体),构型要稳(绝不共线,避免共面)。

    移动点要准(代表目标位置),避免孤立(有路径连固定点),复杂变形需引导(中间加点)。

    边界要强(刚柔交界处密集约束)。

    分布要查(肉眼审视空间覆盖),崩溃要看(根据现象诊断缺哪),调试要调(动态增删点)。

遵循这些技巧能极大提高手动选点方式下ARAP变形的成功率。然而,正如之前提到的,对于复杂模型或非专业用户,实现区域选择(刚性区域+移动点) 或基于控制柄(骨骼/笼子) 的方法,能更直观、更鲁棒地解决约束问题,是更推荐的进阶方向。手动选点对用户经验和耐心要求较高。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published