Unity・3DCG技術ブログ

TAもどきによるUnity・3DCGに関する記事をアップします。

【Maya】Pythonスクリプティング基本メモ

概要

MayaでのPythonの基本的なスクリプティングについて覚えたことのメモ

環境

シーン

シーン内のオブジェクトを列挙

オブジェクトにtransformは必ずあるのでtype="transform"で絞るとシーン内のオブジェクトが取れるって感じですね。

import maya.cmds as cmds

objs = cmds.ls(type="transform")
for o in objs:
    print(o)

# 出力例
front
joint1
joint2
joint3
pSphere
pSphere4
pSphere5
pSphere6
persp
side
top

選択中のオブジェクトを列挙

lsでselection=Trueを渡して選択中のオブジェクトが返ってきます。

import maya.cmds as cmds

objs = cmds.ls(selection=True);
for obj in objs:
    print(obj)

シーン名

開いているシーン名=ファイル名なのでfileコマンドで取得します。

import maya.cmds as cmds
import os.path as path

# シーンへのパス
scenePath = cmds.file(query=True,sceneName=True)
print(scenePath)

# ファイル名
sceneName = path.basename(scenePath).replace(".mb","")
print(sceneName)

# 出力例
D:/MayaTraining/Test.mb
Test

コンポーネント

利用可能なコンポーネントタイプ名の取得

import maya.cmds as cmds

avairableTypes = cmds.ls(nt=True)
for tp in avairableTypes:
    print(tp)

# 出力例
AISEnvFacade
AlembicNode
BifMeshImportNode
BossBlender
BossEXRInfluence
BossGeoProperties
BossSpectralWave
BossWaveSolver
ComputeGlobal
ComputeLocal
...長いので略

【Maya】Pythonスクリプトのパス設定

git管理したい独自のpythonスクリプトフォルダを指定するには userSetup.pyに下記のように指定する。

print("UserSetup..")
import sys
myscripts = "Pythonスクリプトのフォルダパス"
sys.path.append(myscripts)

print("added path:" + myscripts)

追記したらMayaを再起動すると反映される。

【Maya】地面モデリング例【ジオメトリのスカルプトツールとマテリアルのフラクタル】

f:id:serialtv:20220101164607p:plain

概要

ジオメトリのスカルプトツールとマテリアルのフラクタルを使用すれば簡単に地面が作成できたので メモします。

環境

  • Maya2022.3

作業

  1. Planeを作成(縦と横の分割数は50くらい)します。大きさは適当にスケールし、トランスフォームのフリーズをします。
  2. シェルフのカーブ/サーフェスのジオメトリのスカルプトツール
    • f:id:serialtv:20220101165114p:plain
    • ツールの設定を開く
    • f:id:serialtv:20220101165446p:plain
    • 引き出しアイコンを選択します。
    • 最大ディスプレイメントは0.63くらいにします。 ​
    • アトリビュートマップを読み込みで、地面の高さマップ画像を選択します。
    • f:id:serialtv:20220101165736j:plain
    • このような画像を今回使用しました。
    • f:id:serialtv:20220101170413p:plain
    • 地面に凹凸ができます。
  3. マテリアルの設定

    • pPlaneを選択して右クリック新しいマテリアルを割り当てます。
    • f:id:serialtv:20220101170556p:plain
    • Colorでフラクタルを選択します。
    • キーボード6キーを押してテクスチャが表示されるモードに。
    • f:id:serialtv:20220101170803p:plain
    • カラーゲインをいじって色を調整してみます。
  4. 完成

    • f:id:serialtv:20220101170906p:plain

いい感じに地面ができました。

参考動画

参考にした動画はSimple Environment modeling and texturing in Mayaになります。

【Maya】シンプルなローポリツリーを作る

概要

Mayaでシンプルなローポリツリーを作成した際の作業の備忘録になります。

f:id:serialtv:20211209012817p:plain

  1. シリンダーを作成
  2. 軸の分割数(subdivisionsAxis)を 7 に
  3. Shift + 選択でシリンダーを全選択
  4. Shift 押しながら横面を選択で上の面だけ選択に
  5. Shift押しながらフェース移動で押し出す(extrude)
  6. デフォーム>ソフト修正ツールで曲げる
  7. B押しながら左クリックで影響範囲

  1. キューブ作成
  2. 上下面をShift押しながらフェース移動でとがらせる
  3. モデリングツールキット>スムースボタン
  4. 葉を選択
  5. メッシュの編集>トランスフォームオプション
  6. ランダム値を0.5ほどにして頂点のトランスフォームを実行
  7. 移動ハンドルを操作することで頂点が移動する

参考

動画 を参考にさせていただきました。

【Maya】選択中のオブジェクトをまとめて特定のオブジェクト以下の子にする【Python】

Python

import maya.cmds as cmds

objs = cmds.ls(sl=True)

for o in objs:
    print(o)
    cmds.parent(o, "新しい親オブジェクト名" )

備考

親にしたいオブジェクトを最後に選択して p を押しても可能。 (むしろそっちのほうが楽かも..)

【Unity】URPでRendererを切り替える

概要

URPでアウトゲームとインゲームでRendererを切り替えたい場合、

UniversalAdditionalCameraDataSetRenderer で切り替えられる。

f:id:serialtv:20211124002625p:plain

f:id:serialtv:20211124002627p:plain

using UnityEngine;
using UnityEngine.Rendering.Universal;

[ExecuteAlways]
public class URPSetRenderer : MonoBehaviour
{
    public UniversalAdditionalCameraData additionalCameraData;
    [Header("0:for OutGame 1: for InGame")]
    public int rendererIndex;
    void Awake()
    {
        ApplyRendererIndex();
    }

    void OnValidate()
    {
        ApplyRendererIndex();
    }

    void ApplyRendererIndex()
    {
        additionalCameraData.SetRenderer(rendererIndex);
    }
}

【Unity】EditorWindowにWarningを表示するサンプル

概要

f:id:serialtv:20200725003100p:plain

コード

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class ExampleWindow : EditorWindow
{
    [MenuItem("Window/ExampleWindow")]
    static void Init()
    {
        GetWindow<ExampleWindow>();
    }

    void OnEnable()
    {
        var button1 = new Button(() => ShowWarning());
        rootVisualElement.Add(button1);
    }

    void ShowWarning()
    {
        var content = new GUIContent(string.Empty, EditorGUIUtility.FindTexture("console.warnicon"));
        content.text = "Message";
        ShowNotification(content, fadeoutWait: 5);
    }
}