0

我曾在 Daz3d、poser、makehuman 等软件中看到,当穿上衣服的模型被修改(通常带有变形)时,衣服的 3d 模型会自动重塑。我有一种情况,我必须在 opengl es 中做类似的事情。有人可以告诉我这样做的基本逻辑吗?变形再次起作用还是有其他方法?是否有网格修改库

4

1 回答 1

1

我会这样处理它:

  1. 通常表示为某个拓扑网格中的嵌套点网络。为此,我会将衣服分成“圆柱体”。每个“圆柱体”将由点网格表示,如下所示:

    struct _pnt { float x,y,z; bool stretch,done; };
    _pnt pnt[na][nb][3];
    

    在哪里

    • na应取决于气缸直径,但通常na=36在所有情况下都足够了
    • nb应该取决于“圆筒”高度和布料细节......

    圆柱

    每个点都有它的 3D 坐标,这些坐标x,y,z最初设置为布料的形状,就像它充满了气球一样的空气。如果该stretch点位于某些橡皮筋上,则标志会迫使其粘在皮肤上。这done只是计算的临时标志。

  2. 动力学

    现在,如果您想计算实际的布料形状,那么您需要:

    1. done=false为所有点设置
    2. 将所有stretched 点设置到人/虚拟皮肤(网格表面)上的相应位置并为其设置done=true。这些点通常会覆盖整个切片(b=constant,a=0,1,2,...na-1)
    3. 对于每个拉伸点(a0,b0)计算链接点。它背后的数学/物理学是这样的:

      所以扫描点(a0+1,b0),(a0+2,b0)...,如果你碰到另一个stretch点,使用悬链线曲线,如果不使用牛顿/达朗伯动力学模拟来获得位置(为此你需要增加速度。当计算位置时,vx,vy,vz为所有计算点设置。_pntdone=true

      此外,如果一个点的计算位置在化身网格内,您必须将其位置设置为化身表面并将其速度设置为零。

      处理网格自碰撞(动态影响)

    4. 搜索所有未计算的点done==false并从其计算的邻居中插入它们的位置。

如果你得到这个工作,你可以为每个点添加更多的特征,比如弹性、质量、...系数等等。

于 2016-03-19T11:55:55.693 回答