请教一个问题:按照曲线创建骨骼 对MEL基本不懂,有想学的欲望 现在在工作当中遇到一些问题,想请教一下 就是我想先创建一条曲线,然后在创建几段骨骼并吸附到曲线上,并且可以自定义骨骼的数目,也就是按照曲线的弧长来平分骨骼之间的距离 想请问,用MEL怎么实现,大概的一个原理是什么,谢谢 第一次上这个网站发问题 作者: hmaya developer! 查看hmaya的所有文章 看完不过瘾?点此向作者提问
我的想法是这样的: 根据NURBS曲线的U参数,获得曲线上的任意一点的坐标,就可以在此创建骨骼了。 不过一般NURBS曲线的U向参数并没有归一化,骨骼并不会根据弧长均匀分布。 所以如果想要骨骼均匀沿着曲线分布,最好把NURBS曲线Rebuild一下,就可以解决问题了。 具体代码如下,希望可以对你有所启发。 核心命令有两个,pointOnCurve和joint //////////////////////////////////////////////////////////// //created by hmaya at May24 2008 //MEL Command: Curve2Joints(int $pSpan, string $CurveName) //Usage: //1在脚本编辑器中执行该代码 //2指定骨骼段数和NURBS曲线名称 //例如:输入Curve2Joints(6,"curve2")并运行 //注意:为了获得更好的效果,建议运行该MEL之前,把BURBS曲线Rebuild一下 ////////////////////////////////////////////////////////////////// proc Curve2Joints(int $pSpan, string $CurveName){ if($pSpan < 0){ error "Please reassign the number of joints, it should be positive!"; } float $u; if($pSpan <= 0) $u = 0; if($pSpan > 0) $u = 1.0/$pSpan; int $i; for($i = 0; $i <= $pSpan; $i++){ float $parameter = $i*$u; float $pos[] = `pointOnCurve -top 1 -pr $parameter -p $CurveName`; joint -p $pos[0] $pos[1] $pos[2]; } } 回复
可以改进一下用两个快捷按钮实现这个操作 创建窗口 string $myWindow = `window`; columnLayout; string $CVIntSilderGrp = `intSliderGrp -min 0 -max 1000 -label "Number of UV:" -field true`; string $JTIntSilderGrp = `intSliderGrp -min 0 -max 1000 -label "Number of joints:" -field true`; showWindow $myWindow; 回复
建立骨骼 $SLcurve = `ls -sl`; float $CB = `intSliderGrp -q -value $CVIntSilderGrp`; float $JB = `intSliderGrp -q -value $JTIntSilderGrp`; rebuildCurve -ch 1 -rpo 1 -rt 0 -end 1 -kr 0 -kcp 0 -kep 1 -kt 0 -s $CB -d 3 -tol 0.01 $SLcurve; if($JB < 0){ error "Please reassign the number of joints, it should be positive!"; } float $u; if($JB <= 0) $u = 0; if($JB > 0) $u = 1.0/$JB; int $i; for($i = 0; $i <= $JB; $i++){ float $parameter = $i*$u; float $pos[] = `pointOnCurve -top 1 -pr $parameter -p $SLcurve`; joint -p $pos[0] $pos[1] $pos[2]; 两个mel按钮先点第一个按钮创建出一个窗口输入重建曲线的spans数目以及将要建立的骨骼数 输入完毕后 选择所要操作的对象曲线按下第二的按钮 结束 回复
我的想法是这样的:
根据NURBS曲线的U参数,获得曲线上的任意一点的坐标,就可以在此创建骨骼了。
不过一般NURBS曲线的U向参数并没有归一化,骨骼并不会根据弧长均匀分布。
所以如果想要骨骼均匀沿着曲线分布,最好把NURBS曲线Rebuild一下,就可以解决问题了。
具体代码如下,希望可以对你有所启发。
核心命令有两个,pointOnCurve和joint
////////////////////////////////////////////////////////////
//created by hmaya at May24 2008
//MEL Command: Curve2Joints(int $pSpan, string $CurveName)
//Usage:
//1在脚本编辑器中执行该代码
//2指定骨骼段数和NURBS曲线名称
//例如:输入Curve2Joints(6,"curve2")并运行
//注意:为了获得更好的效果,建议运行该MEL之前,把BURBS曲线Rebuild一下
//////////////////////////////////////////////////////////////////
proc Curve2Joints(int $pSpan, string $CurveName){
if($pSpan < 0){ error "Please reassign the number of joints, it should be positive!"; } float $u; if($pSpan <= 0) $u = 0; if($pSpan > 0)
$u = 1.0/$pSpan;
int $i;
for($i = 0; $i <= $pSpan; $i++){ float $parameter = $i*$u; float $pos[] = `pointOnCurve -top 1 -pr $parameter -p $CurveName`; joint -p $pos[0] $pos[1] $pos[2]; } }
可以改进一下用两个快捷按钮实现这个操作
创建窗口
string $myWindow = `window`;
columnLayout;
string $CVIntSilderGrp = `intSliderGrp -min 0
-max 1000
-label
"Number of UV:"
-field true`;
string $JTIntSilderGrp = `intSliderGrp -min 0
-max 1000
-label
"Number of joints:"
-field true`;
showWindow $myWindow;
建立骨骼
$SLcurve = `ls -sl`;
float $CB = `intSliderGrp -q -value $CVIntSilderGrp`;
float $JB = `intSliderGrp -q -value $JTIntSilderGrp`;
rebuildCurve -ch 1 -rpo 1 -rt 0 -end 1 -kr 0 -kcp 0 -kep 1 -kt 0 -s $CB -d 3 -tol 0.01 $SLcurve;
if($JB < 0){ error "Please reassign the number of joints, it should be positive!"; } float $u; if($JB <= 0) $u = 0; if($JB > 0)
$u = 1.0/$JB;
int $i;
for($i = 0; $i <= $JB; $i++){ float $parameter = $i*$u; float $pos[] = `pointOnCurve -top 1 -pr $parameter -p $SLcurve`; joint -p $pos[0] $pos[1] $pos[2]; 两个mel按钮先点第一个按钮创建出一个窗口输入重建曲线的spans数目以及将要建立的骨骼数 输入完毕后 选择所要操作的对象曲线按下第二的按钮 结束
呵呵,谢谢wq_lismi,有了界面的确更加简便易用,赞。