纳金网

标题: [Maya 技巧]用Maya MEL查询骨骼影响的多重点(for game) [打印本页]

作者: 驰骋的风    时间: 2012-10-17 14:06
标题: [Maya 技巧]用Maya MEL查询骨骼影响的多重点(for game)
[Maya 技巧]用Maya MEL查询骨骼影响的多重点(for game)



在游戏公司,这个MEL会有用。

在使用Smooth绑定时,模型上的某一个顶点,可能被多个骨骼同时影响,笔者称这样的顶点为“多重点”。有时在游戏制作中,我们需要将这样被多节骨骼同时影响的多重点找出来。

如图,选择骨骼和圆柱,执行Skin | Bind Skin | Smooth Bind,将三节骨骼和该多边形圆柱绑定起来。





然后将圆柱命名为“obj”,如图,简短的名称便于后面使用MEL时快速的输入。





执行如下MEL,即可以显示圆柱上同时被三节骨骼影响的顶点,如图。





    当findVertex Proc执行过一次后,后面只需要输入函数即可,不需要再次执行proc了。

输入   

findVertex("obj",1);   

即可显示同时被两节骨骼影响的顶点,如图。









输入   

findVertex("obj",2);   

即可显示只被一节骨骼影响的顶点,如图。





该MEL的实现思路主要是使用skinPercent命令,查询某个顶点被某个骨骼的影响权重。该权重为0,则认为该顶点不受该骨骼影响;该权重不为零,则认为该顶点被该骨骼影响。具体的MEL代码如下:



/////////////////////////////////////////////////

//create by Lizhihao at 2007.4.18

//用法:输入已经Smooth绑定的多边形模型名称,和一个整数,执行

//proc findVertex(string $objName, int $n)

//参数说明:-------模型名称--------多重点------

//假设绑定模型上有N节骨骼,则输入n,可以显示被(N-n)节骨骼同时影响的顶点

//例如输入0,则可显示N重点

////////////////////////////////////////////////

proc findVertex(string $objName, int $n){

    select -cl;//clear selection list   



    int $vertexCount[] = `polyEvaluate -v $objName`;

    string $skinName=`findRelatedSkinCluster($objName)`;

    string $jointName[] = `skinCluster -q -wi $skinName`;

    int $jointCount = size($jointName);

    float $weight[];

     

    int $index_vertex;

    int $index_joint;

    int $FLAG;

    int $sum_flag = 0;

     

    for( $index_vertex=0; $index_vertex < $vertexCount[0]; $index_vertex++){

         string $currentVertex = $objName + ".vtx[" + $index_vertex + "]";

         for( $index_joint = 0; $index_joint < $jointCount; $index_joint++){

             $weight[$index_joint] = `skinPercent  

-transform $jointName[$index_joint]

-query $skinName $currentVertex`;

             if( $weight[$index_joint] > 0) $FLAG = 1;

             else                           $FLAG = 0;

             $sum_flag += $FLAG;        

         }//end for $index_joint

         if( $sum_flag == ($jointCount - $n) )

             select -add $currentVertex;

         $sum_flag = 0;//clear $sum_flag



    }//end for  $index_vertex

     

}//end proc



/***n proc

findVertex("obj",0);



更多MAYA技术分享尽在Web3D纳金网http://www.narkii.com/
作者: .    时间: 2012-10-25 21:44
顶起




欢迎光临 纳金网 (http://wwww.narkii.com/club/) Powered by Discuz! X2.5