查看: 1703|回复: 1
打印 上一主题 下一主题

[Maya 技巧]用Maya MEL查询骨骼影响的多重点(for game)

[复制链接]

3795

主题

2

听众

5万

积分

版主

Rank: 7Rank: 7Rank: 7

纳金币
53202
精华
32

活跃会员 优秀版主 推广达人 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2012-10-17 14:06:43 |只看该作者 |倒序浏览
[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/
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

.    

3797

主题

11

听众

5万

积分

首席设计师

Rank: 8Rank: 8

纳金币
32328
精华
41

活跃会员 优秀版主 荣誉管理 论坛元老

沙发
发表于 2012-10-25 21:44:44 |只看该作者
顶起
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-27 07:44 , Processed in 0.238889 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部