MAYAPlugin_Mel_顶点法线批处理_V2

学习目标:

优化之前的顶点法线批处理插件


学习内容:

1、 删除精简不必要的功能(筛选面,软化面)
2、 算法优化(增加运行效率)
3、 增加代码可读性


学习时间:

2天


学习产出:

Adia_vertexNormalBatch_userGuide_V2.mel

//VertexNormalBatchV2
    global proc VertexNormalSort(){
        if(`window -query -exists adia_myVertexNormalSort_Window`)
        deleteUI adia_myVertexNormalSort_Window;
        string $s = "Adia_vertexNormalBatch";
        window -title $s -menuBar true -maximizeButton false -minimizeButton true adia_myVertexNormalSort_Window;
        columnLayout -adjustableColumn true;
            text -label "Refer the manual to use" -en off;
            radioButtonGrp -label "Mode锛? -numberOfRadioButtons 3
            -labelArray3 "Hardening" "Copy" "Paste" -sl 1
            adia_Select;
            button -height 23 -width 23 -backgroundColor 255 241 155 -label "Run"
            -command "Do";
            text -label " " -en off;
        window -edit -widthHeight 600 100 adia_myVertexNormalSort_Window;
        showWindow adia_myVertexNormalSort_Window;
    }
    global string $element_G[]={};
    global string $vertexName_G[]={};
    global string $objectName_G[]={};
    global float $vertexNormal_G[]={};
    proc Do()
    {
        init();
        int $UISwitch = `radioButtonGrp -q -sl adia_Select`;
        switch($UISwitch)
        {
            case 1:
                hardening();
            break;
            case 2:
                copy();
            break;
            case 3:
                paste();
            break;
            default:
                print("Not In UI");
            break;
        }
    }
    proc hardening()
    {
        global string $element_G[];
        global string $vertexName_G[];
        global string $objectName_G[];
        print("Harden Run"+"\n");
        string $vtxlist[] = `polyListComponentConversion -ff -tv $element_G`;
        $vtxlist = `filterExpand -sm 31 -ex true $vtxlist`;
        for($vtx in $vtxlist)
        {
            string $faceList[] = `polyListComponentConversion -fv -tf $vtx`;
            $faceList =`filterExpand -sm 34 -ex true $faceList`;
            string $faceList2[] = stringArrayRemove($element_G,$faceList);
            float $avNormal[] = {0,0,0};
            int $i = 0;
            if(size($faceList2)==0)
            {
                $faceList2 = $faceList;
            }
            for($ff in $faceList2)
            {
                string $nrm[] = `polyInfo -faceNormals $ff`;
                string $tkBuf[];
                float $tNml[] = {0,0,0};
                tokenize $nrm[0] " " $tkBuf;
                $tNml[0]+=((float)($tkBuf[2]));
                $tNml[1]+=((float)($tkBuf[3]));
                $tNml[2]+=((float)($tkBuf[4]));
                $avNormal[0] += $tNml[0];
                $avNormal[1] += $tNml[1];
                $avNormal[2] += $tNml[2];
                $i++;
            }
            if($i)
            {
                $avNormal[0] = $avNormal[0]/$i;
                $avNormal[1] = $avNormal[1]/$i;
                $avNormal[2] = $avNormal[2]/$i;
                normalize($avNormal);
                polyNormalPerVertex -xyz $avNormal[0] $avNormal[1] $avNormal[2] $vtx;
            }
        }
        string $shorterList[] = stringArrayRemoveDuplicates($vertexName_G);
        string $diff[] = stringArrayRemoveExact($shorterList,$vertexName_G);
        select -cl;
        if(size($diff)>0)
        {
            for($each in $diff)
            {
                string $check[]={};
                tokenize $each "vtx[" $check;
                if($check[1]!="\n"+"]")
                {
                    if(catch (`select -tgl $each`))
                    {
                    }
                    else
                    {
                        select -cl;
                        select -tgl $each ;
                        polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                        select -cl;
                    }
                }
            }
            if(catch(`select -r $objectName_G[0]`))
            {
            }else{select -r $objectName_G[0];}
            for($ele in $element_G)
            {
                if(catch(`select -tgl $ele`))
                {
                    print("erro");
                }
                else{
                    select -add $ele;
                }
            }
        }
        
        pause -sec 1;
        freed("Successfully hardening normal information!");
    }
    proc copy()
    {
       
        global float $vertexNormal_G[];
        print("Copy Run"+"\n");
        string $selectList[];
        $selectList = `ls -selection -flatten`;
        $elementVertex = `filterExpand -expand on -selectionMask 31 -selectionMask 70 $selectList`;
        $elementFace = `filterExpand -expand on -selectionMask 34 $selectList`;
        if(size($elementVertex)>0)
        {
            $vertexNormal_G = `polyNormalPerVertex -q -xyz $elementVertex[0]`;
            print("Copy Value:"+"x:"+ $vertexNormal_G[0]  +"__y:"+$vertexNormal_G[1]  +"__z:"+$vertexNormal_G[2]);
        }
        else if(size($elementFace)>0)
        {
            string $faceNormal[] = `polyInfo -fn $elementFace[0]`;
            string $tkBuf[];
		    float $tNml[]={0,0,0};
		    tokenize $faceNormal[0] " " $tkBuf;
		    $tNml[0]+=((float)($tkBuf[2]));
		    $tNml[1]+=((float)($tkBuf[3]));
		    $tNml[2]+=((float)($tkBuf[4]));
            string $aObjName[] = stringToStringArray( $elementFace[0], ".");
            matrix $mNrm[1][4] = adia_ObjToWorldSpace(
		 	adia_CreateVecMatrix($tNml[0],$tNml[1],$tNml[2])
			,$aObjName[0]);
            float $fVec3[3] = <<$mNrm[0][0], $mNrm[0][1], $mNrm[0][2]>>;
		    normalize($fVec3);
            $vertexNormal_G[0]=$fVec3[0];
            $vertexNormal_G[1]=$fVec3[1];
            $vertexNormal_G[2]=$fVec3[2];
            print("Copy Value:"+"x:"+ $vertexNormal_G[0]  +"__y:"+$vertexNormal_G[1]  +"__z:"+$vertexNormal_G[2]);
        }
        freed("Successfully copy normal information!");
    }
    proc paste()
    {
        
        global float $vertexNormal_G[];
        print("Paste Run"+"\n");
        string $selectList[];
        $selectList = `ls -selection -flatten`;
        $elementVertex = `filterExpand -expand on -selectionMask 31 -selectionMask 70 $selectList`;
        $elementFace = `filterExpand -expand on -selectionMask 34 $selectList`;
        if(size($elementVertex)>0)
        {
            for($i=0;$i<size($elementVertex);$i++)
            {
                polyNormalPerVertex -xyz $vertexNormal_G[0] $vertexNormal_G[1] $vertexNormal_G[2] $elementVertex[$i];
            }
        }
        if(size($elementFace)>0)
        {
		    string $sVtxF_c[] = adia_classifyWithObj(`polyListComponentConversion   -toVertexFace $elementFace`);
		    int $i = size($sVtxF_c) / 2;
		    for($n=0; $n<$i; $n++){
		    	matrix $mNrm[1][4] = adia_WorldToObjSpace(adia_CreateVecMatrix($vertexNormal_G [0],$vertexNormal_G[1],$vertexNormal_G[2]),$sVtxF_c[$n*2]);
		    	float $fVec3[3] = <<$mNrm[0][0], $mNrm[0][1], $mNrm[0][2]>>;
		    	normalize($fVec3);
		    	string $sStr[];
		    	tokenizeList($sVtxF_c[$n*2 + 1],$sStr);
		    	select $sStr;
		    	polyNormalPerVertex -xyz $fVec3[0] $fVec3[1] $fVec3[2];
		    }	
        }
      
        freed("Successfully pasted normal information!");
    }
    //tool
    proc init()
    {
        global string $element_G[];
        global string  $vertexName_G[];
        global string $objectName_G[];
        string $selectList[];
        $selectList = `ls -selection -flatten`;
        string $element[];
        $element = `filterExpand -expand on -selectionMask 34 $selectList`;
        for($ele in $element)
        {
            $element_G[size($element_G)] = $ele;
        }
        if(size($element)>0)
        {
            print("Executing...");
            for($i = 0 ; $i < size($element); $i++)
            {
                string $objectName[] = stringToStringArray($element[$i], ".");
                $objectName_G[0] = $objectName[0];
                string $sFaceVertexNormal[]=`polyInfo -faceToVertex $element[$i]`; 
                string $vertex[] = stringToStringArray($sFaceVertexNormal[0], " ");
                string $face[] = stringToStringArray($vertex[1],":");
                string $pointPosName1 = $objectName[0]+".vtx["+ $vertex[2] +"]";
                string $pointPosName2 = $objectName[0]+".vtx["+ $vertex[3] +"]";
                string $pointPosName3 = $objectName[0]+".vtx["+ $vertex[4] +"]";
                string $pointPosName4 = $objectName[0]+".vtx["+ $vertex[5] +"]";
                $vertexName_G[size($vertexName_G)] = $pointPosName1;
                $vertexName_G[size($vertexName_G)] = $pointPosName2;
                $vertexName_G[size($vertexName_G)] = $pointPosName3;
                $vertexName_G[size($vertexName_G)] = $pointPosName4;
            }
        }
    }
    proc freed(string $printStr)
    {
        global string $element_G[];
        global string $vertexName_G[];
        global string $objectName_G[];
        print($printStr);
        clear $element_G;
        clear $vertexName_G;
        clear $objectName_G;
    }
    global proc matrix adia_ObjToWorldSpace(matrix $mIn_Mtx,string $sObj)
    {
	    matrix $mMtx[4][4] = adia_GetObjInvMatrix($sObj);
	    matrix $mRes_Mtx[1][4]=$mIn_Mtx*$mMtx;
	    return($mRes_Mtx);  
    }
    global proc matrix adia_CreateVecMatrix(float $x, float$y, float$z)
    {
	    matrix $mRes_Mtx[1][4]=<<$x,$y,$z,0>>;
	    return($mRes_Mtx);
    }
    global proc matrix adia_GetObjInvMatrix(string $sObj)
    {
    	float $fMat[] = `getAttr ($sObj+".inverseMatrix")`;
    	matrix $mMat[4][4]=<<
    	$fMat[0],$fMat[4],$fMat[8],$fMat[12];
    	$fMat[1],$fMat[5],$fMat[9],$fMat[13];
    	$fMat[2],$fMat[6],$fMat[10],$fMat[14];
    	$fMat[3],$fMat[7],$fMat[11],$fMat[15]>>;
    	return($mMat);
    }
    global proc string[] adia_classifyWithObj(string $slist[])
    {
    	string $Res[] ;
    	string $sArr[] = sort($slist);
    	string $sObjName = "";
    	string $sCrntObjName[];
    	int $i=-1;
    	string $sNameArray[];
    	if(size($sArr)){
    		for($sElm in $sArr){
    			$sNameArray = stringToStringArray($sElm, ".");
    			if($sNameArray[0] != $sObjName){
    				$i++;
    				$sObjName = $sNameArray[0];
    				$Res[$i*2]= $sNameArray[0];
    				$Res[$i*2+1]= $sElm;
    			}else{
    				$Res[$i*2+1] = $Res[$i*2+1] + " " + $sElm;
    			}
    		}
    	}
    	return($Res);
    }
    global proc matrix adia_WorldToObjSpace(matrix $mIn_Mtx,string $sObj)
    {
    	matrix $mMtx[4][4] = adia_GetObjMatrix($sObj);
    	matrix $mRes_Mtx[1][4]=$mIn_Mtx*$mMtx;
    	return($mRes_Mtx);
    }
    global proc matrix adia_GetObjMatrix(string $sObj)
    {
    	
    	float $fMat[] = `getAttr ($sObj+".matrix")`;
    	matrix $mMat[4][4]=<<
    	$fMat[0],$fMat[4],$fMat[8],$fMat[12];
    	$fMat[1],$fMat[5],$fMat[9],$fMat[13];
    	$fMat[2],$fMat[6],$fMat[10],$fMat[14];
    	$fMat[3],$fMat[7],$fMat[11],$fMat[15]>>;

    	return($mMat);
    }
    VertexNormalSort();

Adia_vertexNormalBatch_userGuide_V2_main.mel

global string $gShelfTopLevel;
string $shelves[] = `tabLayout -q -childArray $gShelfTopLevel`;
int $counter=0;
int $btmCounter=0;
string $imageSet = "selectSurfaceBorder.png";
string $buttonLab = "Adia_vertexNormalBatchV2";
string $buttonAnnotation = "Adia_vertexNormalBatchV2(PleaseReadUserGuide)";
string $script = "//VertexNormalBatchV2 \n     global proc VertexNormalSort(){ \n         if(`window -query -exists adia_myVertexNormalSort_Window`) \n         deleteUI adia_myVertexNormalSort_Window; \n         string $s = \"Adia_vertexNormalBatch\"; \n         window -title $s -menuBar true -maximizeButton false -minimizeButton true adia_myVertexNormalSort_Window; \n         columnLayout -adjustableColumn true; \n             text -label \"Refer the manual to use\" -en off; \n             radioButtonGrp -label \"Mode\" -numberOfRadioButtons 3 \n             -labelArray3 \"Hardening\" \"Copy\" \"Paste\" -sl 1 \n             adia_Select; \n             button -height 23 -width 23 -backgroundColor 255 241 155 -label \"Run\" \n             -command \"Do\"; \n             text -label \" \" -en off; \n         window -edit -widthHeight 600 100 adia_myVertexNormalSort_Window; \n         showWindow adia_myVertexNormalSort_Window; \n     } \n     global string $element_G[]={}; \n     global string $vertexName_G[]={}; \n     global string $objectName_G[]={}; \n     global float $vertexNormal_G[]={}; \n     proc Do() \n     { \n         init(); \n         int $UISwitch = `radioButtonGrp -q -sl adia_Select`; \n         switch($UISwitch) \n         { \n             case 1: \n                 hardening(); \n             break; \n             case 2: \n                 copy(); \n             break; \n             case 3: \n                 paste(); \n             break; \n             default: \n                 print(\"Not In UI\"); \n             break; \n         } \n     } \n     proc hardening() \n     { \n         global string $element_G[]; \n         global string $vertexName_G[]; \n         global string $objectName_G[]; \n         print(\"Harden Run\"+\"\\n\"); \n         string $vtxlist[] = `polyListComponentConversion -ff -tv $element_G`; \n         $vtxlist = `filterExpand -sm 31 -ex true $vtxlist`; \n         for($vtx in $vtxlist) \n         { \n             string $faceList[] = `polyListComponentConversion -fv -tf $vtx`; \n             $faceList =`filterExpand -sm 34 -ex true $faceList`; \n             string $faceList2[] = stringArrayRemove($element_G,$faceList); \n             float $avNormal[] = {0,0,0}; \n             int $i = 0; \n             if(size($faceList2)==0) \n             { \n                 $faceList2 = $faceList; \n             } \n             for($ff in $faceList2) \n             { \n                 string $nrm[] = `polyInfo -faceNormals $ff`; \n                 string $tkBuf[]; \n                 float $tNml[] = {0,0,0}; \n                 tokenize $nrm[0] \" \" $tkBuf; \n                 $tNml[0]+=((float)($tkBuf[2])); \n                 $tNml[1]+=((float)($tkBuf[3])); \n                 $tNml[2]+=((float)($tkBuf[4])); \n                 $avNormal[0] += $tNml[0]; \n                 $avNormal[1] += $tNml[1]; \n                 $avNormal[2] += $tNml[2]; \n                 $i++; \n             } \n             if($i) \n             { \n                 $avNormal[0] = $avNormal[0]/$i; \n                 $avNormal[1] = $avNormal[1]/$i; \n                 $avNormal[2] = $avNormal[2]/$i; \n                 normalize($avNormal); \n                 polyNormalPerVertex -xyz $avNormal[0] $avNormal[1] $avNormal[2] $vtx; \n             } \n         } \n         string $shorterList[] = stringArrayRemoveDuplicates($vertexName_G); \n         string $diff[] = stringArrayRemoveExact($shorterList,$vertexName_G); \n         select -cl; \n         if(size($diff)>0) \n         { \n             for($each in $diff) \n             { \n                 string $check[]={}; \n                 tokenize $each \"vtx[\" $check; \n                 if($check[1]!=\"\\n\"+\"]\") \n                 { \n                     if(catch (`select -tgl $each`)) \n                     { \n                     } \n                     else \n                     { \n                         select -cl; \n                         select -tgl $each ; \n                         polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ; \n                         select -cl; \n                     } \n                 } \n             } \n             if(catch(`select -r $objectName_G[0]`)) \n             { \n             }else{select -r $objectName_G[0];} \n             for($ele in $element_G) \n             { \n                 if(catch(`select -tgl $ele`)) \n                 { \n                     print(\"erro\"); \n                 } \n                 else{ \n                     select -add $ele; \n                 } \n             } \n         } \n          \n         pause -sec 1; \n         freed(\"Successfully hardening normal information!\"); \n     } \n     proc copy() \n     { \n         \n         global float $vertexNormal_G[]; \n         print(\"Copy Run\"+\"\\n\"); \n         string $selectList[]; \n         $selectList = `ls -selection -flatten`; \n         $elementVertex = `filterExpand -expand on -selectionMask 31 -selectionMask 70 $selectList`; \n         $elementFace = `filterExpand -expand on -selectionMask 34 $selectList`; \n         if(size($elementVertex)>0) \n         { \n             $vertexNormal_G = `polyNormalPerVertex -q -xyz $elementVertex[0]`; \n             print(\"Copy Value:\"+\"x:\"+ $vertexNormal_G[0]  +\"__y:\"+$vertexNormal_G[1]  +\"__z:\"+$vertexNormal_G[2]); \n         } \n         else if(size($elementFace)>0) \n         { \n             string $faceNormal[] = `polyInfo -fn $elementFace[0]`; \n             string $tkBuf[]; \n 		    float $tNml[]={0,0,0}; \n 		    tokenize $faceNormal[0] \" \" $tkBuf; \n 		    $tNml[0]+=((float)($tkBuf[2])); \n 		    $tNml[1]+=((float)($tkBuf[3])); \n 		    $tNml[2]+=((float)($tkBuf[4])); \n             string $aObjName[] = stringToStringArray( $elementFace[0], \".\"); \n             matrix $mNrm[1][4] = adia_ObjToWorldSpace( \n 		 	adia_CreateVecMatrix($tNml[0],$tNml[1],$tNml[2]) \n 			,$aObjName[0]); \n             float $fVec3[3] = <<$mNrm[0][0], $mNrm[0][1], $mNrm[0][2]>>; \n 		    normalize($fVec3); \n             $vertexNormal_G[0]=$fVec3[0]; \n             $vertexNormal_G[1]=$fVec3[1]; \n             $vertexNormal_G[2]=$fVec3[2]; \n             print(\"Copy Value:\"+\"x:\"+ $vertexNormal_G[0]  +\"__y:\"+$vertexNormal_G[1]  +\"__z:\"+$vertexNormal_G[2]); \n         } \n         freed(\"Successfully copy normal information!\"); \n     } \n     proc paste() \n     { \n          \n         global float $vertexNormal_G[]; \n         print(\"Paste Run\"+\"\\n\"); \n         string $selectList[]; \n         $selectList = `ls -selection -flatten`; \n         $elementVertex = `filterExpand -expand on -selectionMask 31 -selectionMask 70 $selectList`; \n         $elementFace = `filterExpand -expand on -selectionMask 34 $selectList`; \n         if(size($elementVertex)>0) \n         { \n             for($i=0;$i<size($elementVertex);$i++) \n             { \n                 polyNormalPerVertex -xyz $vertexNormal_G[0] $vertexNormal_G[1] $vertexNormal_G[2] $elementVertex[$i]; \n             } \n         } \n         if(size($elementFace)>0) \n         { \n 		    string $sVtxF_c[] = adia_classifyWithObj(`polyListComponentConversion   -toVertexFace $elementFace`); \n 		    int $i = size($sVtxF_c) / 2; \n 		    for($n=0; $n<$i; $n++){ \n 		    	matrix $mNrm[1][4] = adia_WorldToObjSpace(adia_CreateVecMatrix($vertexNormal_G [0],$vertexNormal_G[1],$vertexNormal_G[2]),$sVtxF_c[$n*2]); \n 		    	float $fVec3[3] = <<$mNrm[0][0], $mNrm[0][1], $mNrm[0][2]>>; \n 		    	normalize($fVec3); \n 		    	string $sStr[]; \n 		    	tokenizeList($sVtxF_c[$n*2 + 1],$sStr); \n 		    	select $sStr; \n 		    	polyNormalPerVertex -xyz $fVec3[0] $fVec3[1] $fVec3[2]; \n 		    }	 \n         } \n        \n         freed(\"Successfully pasted normal information!\"); \n     } \n     //tool \n     proc init() \n     { \n         global string $element_G[]; \n         global string  $vertexName_G[]; \n         global string $objectName_G[]; \n         string $selectList[]; \n         $selectList = `ls -selection -flatten`; \n         string $element[]; \n         $element = `filterExpand -expand on -selectionMask 34 $selectList`; \n         for($ele in $element) \n         { \n             $element_G[size($element_G)] = $ele; \n         } \n         if(size($element)>0) \n         { \n             print(\"Executing...\"); \n             for($i = 0 ; $i < size($element); $i++) \n             { \n                 string $objectName[] = stringToStringArray($element[$i], \".\"); \n                 $objectName_G[0] = $objectName[0]; \n                 string $sFaceVertexNormal[]=`polyInfo -faceToVertex $element[$i]`;  \n                 string $vertex[] = stringToStringArray($sFaceVertexNormal[0], \" \"); \n                 string $face[] = stringToStringArray($vertex[1],\":\"); \n                 string $pointPosName1 = $objectName[0]+\".vtx[\"+ $vertex[2] +\"]\"; \n                 string $pointPosName2 = $objectName[0]+\".vtx[\"+ $vertex[3] +\"]\"; \n                 string $pointPosName3 = $objectName[0]+\".vtx[\"+ $vertex[4] +\"]\"; \n                 string $pointPosName4 = $objectName[0]+\".vtx[\"+ $vertex[5] +\"]\"; \n                 $vertexName_G[size($vertexName_G)] = $pointPosName1; \n                 $vertexName_G[size($vertexName_G)] = $pointPosName2; \n                 $vertexName_G[size($vertexName_G)] = $pointPosName3; \n                 $vertexName_G[size($vertexName_G)] = $pointPosName4; \n             } \n         } \n     } \n     proc freed(string $printStr) \n     { \n         global string $element_G[]; \n         global string $vertexName_G[]; \n         global string $objectName_G[]; \n         print($printStr); \n         clear $element_G; \n         clear $vertexName_G; \n         clear $objectName_G; \n     } \n     global proc matrix adia_ObjToWorldSpace(matrix $mIn_Mtx,string $sObj) \n     { \n 	    matrix $mMtx[4][4] = adia_GetObjInvMatrix($sObj); \n 	    matrix $mRes_Mtx[1][4]=$mIn_Mtx*$mMtx; \n 	    return($mRes_Mtx);   \n     } \n     global proc matrix adia_CreateVecMatrix(float $x, float$y, float$z) \n     { \n 	    matrix $mRes_Mtx[1][4]=<<$x,$y,$z,0>>; \n 	    return($mRes_Mtx); \n     } \n     global proc matrix adia_GetObjInvMatrix(string $sObj) \n     { \n     	float $fMat[] = `getAttr ($sObj+\".inverseMatrix\")`; \n     	matrix $mMat[4][4]=<< \n     	$fMat[0],$fMat[4],$fMat[8],$fMat[12]; \n     	$fMat[1],$fMat[5],$fMat[9],$fMat[13]; \n     	$fMat[2],$fMat[6],$fMat[10],$fMat[14]; \n     	$fMat[3],$fMat[7],$fMat[11],$fMat[15]>>; \n     	return($mMat); \n     } \n     global proc string[] adia_classifyWithObj(string $slist[]) \n     { \n     	string $Res[] ; \n     	string $sArr[] = sort($slist); \n     	string $sObjName = \"\"; \n     	string $sCrntObjName[]; \n     	int $i=-1; \n     	string $sNameArray[]; \n     	if(size($sArr)){ \n     		for($sElm in $sArr){ \n     			$sNameArray = stringToStringArray($sElm, \".\"); \n     			if($sNameArray[0] != $sObjName){ \n     				$i++; \n     				$sObjName = $sNameArray[0]; \n     				$Res[$i*2]= $sNameArray[0]; \n     				$Res[$i*2+1]= $sElm; \n     			}else{ \n     				$Res[$i*2+1] = $Res[$i*2+1] + \" \" + $sElm; \n     			} \n     		} \n     	} \n     	return($Res); \n     } \n     global proc matrix adia_WorldToObjSpace(matrix $mIn_Mtx,string $sObj) \n     { \n     	matrix $mMtx[4][4] = adia_GetObjMatrix($sObj); \n     	matrix $mRes_Mtx[1][4]=$mIn_Mtx*$mMtx; \n     	return($mRes_Mtx); \n     } \n     global proc matrix adia_GetObjMatrix(string $sObj) \n     { \n     	 \n     	float $fMat[] = `getAttr ($sObj+\".matrix\")`; \n     	matrix $mMat[4][4]=<< \n     	$fMat[0],$fMat[4],$fMat[8],$fMat[12]; \n     	$fMat[1],$fMat[5],$fMat[9],$fMat[13]; \n     	$fMat[2],$fMat[6],$fMat[10],$fMat[14]; \n     	$fMat[3],$fMat[7],$fMat[11],$fMat[15]>>; \n  \n     	return($mMat); \n     } \n     VertexNormalSort();";
for($s in $shelves)
{
    if($s=="Adia_Tools")
    {
        string $shelfButtons[] = `shelfLayout -q -childArray "Adia_Tools"`;
        for($b in $shelfButtons)
        {
            string $label;
            if(`objectTypeUI -isType "shelfButton" $b`)
            {
                $label = `shelfButton -q -label $b`;
                if($label==$buttonLab)
                {
                   
                    deleteUI $b;
                     
                }
                else{
                    if($btmCounter==0)
                    {
                        string $myButton = `shelfButton
                        -parent "Adia_Tools"           
                        -enable 1
                        -width 34
                        -height 34
                        -manage 1
                        -visible 1
                        -annotation $buttonAnnotation
                        -label $buttonLab
                        -image1 $imageSet
                        -style "iconOnly"
                        -command $script`;
                        $btmCounter++;
                    }else
                    {
                        print("got same shelfButton");
                    }
                
                }
            }
        }
        if(size($shelfButtons)==0)
        {
            string $myButton = `shelfButton
            -rpt true
            -parent "Adia_Tools"           
            -enable 1
            -width 34
            -height 34
            -manage 1
            -visible 1
            -annotation $buttonAnnotation
            -label $buttonLab
            -image1 $imageSet
            -style "iconOnly"
            -command  $script`;
        }
    }else{
        $counter++;
        if($counter==size($shelves))
        {
            addNewShelfTab "Adia_Tools";
            string $myButton = `shelfButton
            -rpt true
            -parent "Adia_Tools"           
            -enable 1
            -width 34
            -height 34
            -manage 1
            -visible 1
            -annotation $buttonAnnotation
            -label $buttonLab
            -image1 $imageSet
            -style "iconOnly"
            -command  $script`;
        }
    }
}

ReadMe.txt

Adia_vertexNormalBatch_userGuide_V2使用方法:

目标:
	将顶点法线显示正常。
步骤:
	1.安装插件,将mel脚本拖入或者以记事本打开复制(Window>UI Element>Command Line)
	2.打开插件(Window>UI Element>Shelf>Adia_Tools>Adia_vertexNormalBatchV2)
	3.锐化倒角面:选择倒角面,模式选择:Hardening,点击Run。
	4.复制粘贴法线信息:
	   复制:
	      模式选择:Copy,选择单个vertexFace/Face/vertex,点击Run,复制法线信息。
	   粘贴:
	      模式选择:Paste,选择任意数量的vertexFace/Face/vertex,点击Run,粘贴法线信息。
	
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值