项目需要,要在人头上把头发CV曲线多余的部分切掉,所以需要开发一个用polygon模型去切CV曲线的工具。
可以通过Polygon -> Subdiv模型,然后用Sbudiv模型去切曲线,这个在maya里已经集成了。
我用纯数学的方法写了一个。
大体思路:
1,找到每根曲线上和polygon相交的是哪个面
2,近似的把CV曲线看成是每2个相邻CV点的线段组成的,然后找到和polygon相交的是哪2个CV点
3,在这2个CV点之间做折半查找,直到找到的点到平面的距离小于一个阈值。
由于工具演示效果不够震撼,所以就不放视频了,放截图吧。
准备工作:
切后:
这几根曲线用了不到0.1秒。
现在挑战高难度:
40根CV曲线
用时 0.28秒
结果如下:
挑战400根
用时 2.2S
如图:
效果如下:
后记:
其实就是一些空间直线和平面的方程组求解,不过程序有一个小问题,如果CV曲线上的点不够多,即CV曲线不够平滑,结果可能会出现错误,原因是,我实在是找不到Maya里面3个knot的CV曲线的实际点坐标,如图:
如果哪位大神指导,望不吝赐教啊!!!
补记:
今天群里军神问了这个问题,另外一位大神给出了maya的解决方案:
import maya.cmds as mc
import maya.mel as mel
def cut_curve():
sels = mc.ls(sl=True)
mesh = sels[-1]
for sel in sels[:-1]:
try:
cur = mc.polyProjectCurve(sel, mesh, ch=0, pointsOnEdges=1, curveSamples=50, automatic=1)[0]
cur_chr = mc.listRelatives(cur, c=True)[0]
mc.arclen(cur_chr, ch=True)
mc.select([sel, cur])
mel.eval('cutCurvePreset(1,1,0.01,6,0,1,0,2,2)')
mc.delete(cur)
except:
pass
cut_curve()