我已经看到3D服装项目模型在Daz3d,poser,makehuman等软件中自动重塑,当穿着的模特被修改时(通常用变形)。我有一种情况,我必须在opengl es做类似的事情。有人可以告诉我这样做的基本逻辑吗?是变形工作还是有其他方式吗? 是否有网格修改库
答案 0 :(得分:1)
我会这样做:
<强>网强>
通常表示为某些拓扑网格中的嵌套点网络。为此我会把衣服分成“圆筒”。每个“圆柱体”将由点网格表示,如下所示:
struct _pnt { float x,y,z; bool stretch,done; };
_pnt pnt[na][nb][3];
其中
na
应该取决于圆柱直径,但通常na=36
在所有情况下都足够了nb
应取决于“cyliner”高度和布料细节...... 每个点的3D坐标x,y,z
最初设置为布料的形状,就像充满气球般的空气一样。 stretch
标志如果该点位于某个橡皮筋上,迫使其粘在皮肤上。 done
只是计算的临时标志。
<强>动力学强>
现在,如果你想计算实际的布料形状,那么你需要:
done=false
stretch
个ed点设置为人/假皮肤(网格曲面)上的相应位置,并为它们设置done=true
。这些点通常会覆盖整个切片(b=constant,a=0,1,2,...na-1)
(a0,b0)
的计算链接点。背后的数学/物理是:
所以如果你点击另一个(a0+1,b0),(a0+2,b0)...
点使用第二曲线并且如果不使用 Newtonian / D'Alembert 动力学模拟来获得位置(那个yu),则扫描点stretch
需要将速度vx,vy,vz
添加到_pnt
。当计算位置时,为所有计算点设置done=true
。
此外,如果点的计算位置在头像网格中,则必须将其位置设置为头像表面并将其速度设置为零。
处理网格自碰撞(动态影响)
搜索所有非计算点done==false
并从其计算的邻居中插入其位置。
如果你有这个工作,你可以为每个点添加更多的功能,如弹性,质量,...系数等。