我已经看到3D服装项目模型在Daz3d,poser,makehuman等软件中自动重塑,当穿着的模特被修改时(通常用变形)。我有一种情况,我必须在opengl es做类似的事情。有人可以告诉我这样做的基本逻辑吗?是变形工作还是有其他方式吗?是否有网格修改库
我会像这样接近它:
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)
计算链接点。背后的数学/物理是这样的:
Catenary Curves
Newtonian / D'ALembert dynamics
所以扫描点(a0+1,b0),(a0+2,b0)...
,如果你击中另一个stretch
点使用caternary曲线,如果不使用Newtonian / D'Alembert动力学模拟获得位置(因为你需要将速度vx,vy,vz
添加到_pnt
。当计算位置时设置done=true
为所有计算点。
此外,如果计算出的点位于头像网格中,则必须将其位置设置为头像表面并将其速度设置为零。
处理网格自碰撞(动态冲击)
搜索所有非计算点done==false
并从其计算的邻居中插入它们的位置。如果你有这个工作,你可以添加更多的功能,如弹性,质量,...每个点的系数等。