D日記

モーションアーティストの技術ブログだよ。日常も書くよ。

MENU

【Maya.mel】画像サイズに合わせた板ポリを作る(複数可)

経緯

テクスチャと同じ比率のポリゴンを作るシチュエーションが多かった為、ラクシタクなりました!

ツール動作

ちなみに、ノードを選択して実行すると、そのノードの子になります。

コード

下記をコピーして、Mayaのコマンドラインに貼り付けてください!
Maya2019でしか確認してません!

global proc createPlaneWithTexture() {
    string $filePaths[] = `fileDialog2 -fileMode 4 -caption "Select PNG Files" -fileFilter "*.png"`;
    if (size($filePaths) == 0) {
        return;
    }
    
    for ($filePath in $filePaths) {
        // テクスチャ名取得
        string $textureName = `basenameEx $filePath`;
        
        // 画像の寸法を取得(ImageMagickを使わずMayaの方法を利用)
        string $fileNodeArray[];
        $fileNodeArray[0] = `shadingNode -asTexture file -name ("file_" + $textureName)`;global proc createPlaneWithTexture() {
    string $filePaths[] = `fileDialog2 -fileMode 4 -caption "Select PNG Files" -fileFilter "*.png"`;
    if (size($filePaths) == 0) {
        return;
    }
    
    string $selectedNodes[] = `ls -sl -type transform`;
    string $parentNode = (size($selectedNodes) > 0) ? $selectedNodes[0] : "";

    for ($filePath in $filePaths) {
        // テクスチャ名取得
        string $textureName = `basenameEx $filePath`;
        
        // 画像の寸法を取得(ImageMagickを使わずMayaの方法を利用)
        string $fileNodeArray[];
        $fileNodeArray[0] = `shadingNode -asTexture file -name ("file_" + $textureName)`;
        string $fileNode = $fileNodeArray[0]; // 配列の最初の要素を取得

        setAttr ($fileNode + ".fileTextureName") -type "string" $filePath;
        refresh;
        int $width = `getAttr ($fileNode + ".outSizeX")`;
        int $height = `getAttr ($fileNode + ".outSizeY")`;
        
        // 比率計算
        float $planeWidth = ((float)$width) / 1000.0;
        float $planeHeight = ((float)$height) / 1000.0;
        
        // 平面ポリゴン作成
        string $planeArray[] = `polyPlane -w $planeWidth -h $planeHeight -sx 1 -sy 1 -name ($textureName)`;
        string $plane = $planeArray[0]; // 配列の最初の要素を取得
        
        // 選択ノードがある場合、作成した平面を選択ノードの子にする
        if ($parentNode != "") {
            parent $plane $parentNode;
            setAttr ($plane + ".translate") 0 0 0;
            setAttr ($plane + ".rotate") 0 0 0;
            setAttr ($plane + ".scale") 1 1 1;
        }
        
        // マテリアル作成
        string $material = "mat_" + $textureName;
        string $shaderArray[];
        $shaderArray[0] = `shadingNode -asShader lambert -name $material`;
        string $shader = $shaderArray[0]; // 配列の最初の要素を取得

        setAttr ($shader + ".ambientColor") -type double3 1 1 1;
        setAttr ($shader + ".incandescence") -type double3 0 0 0;
        setAttr ($shader + ".diffuse") 0;

        // Place2dTextureノード作成と接続
        string $place2dArray[];
        $place2dArray[0] = `shadingNode -asUtility place2dTexture -name ("p2dTex_" + $textureName)`;
        string $place2d = $place2dArray[0];

        connectAttr -f ($place2d + ".outUV") ($fileNode + ".uvCoord");
        connectAttr -f ($place2d + ".outUvFilterSize") ($fileNode + ".uvFilterSize");

        // テクスチャ接続
        connectAttr ($fileNode + ".outColor") ($shader + ".color");
        connectAttr ($fileNode + ".outTransparency") ($shader + ".transparency");

        // シェーディンググループ作成 & 適用
        string $shadingGroup = `sets -renderable true -noSurfaceShader true -empty -name ($shader + "SG")`;
        connectAttr -force ($shader + ".outColor") ($shadingGroup + ".surfaceShader");
        select -r $plane;
        hyperShade -assign $shader;
    }
}

createPlaneWithTexture();


既出バグ

未発見(募集中!