用Maya MEL查询骨骼影响的多重点【for game】

用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
//run proc
findVertex("obj",0);

作者: hmaya

developer!

看完不过瘾?点此向作者提问

《用Maya MEL查询骨骼影响的多重点【for game】》有一个想法

发表评论

邮箱地址不会被公开。 必填项已用*标注