BLOG

RECENT ENTRY

ARCHIVES

カテゴリー別 : 社内イベント

Mayaのスクリプト紹介

こんにちは!
Development Div./Rig Dept. 所属のIです。
筆者は毎年この時期は花粉に悩まされています…が、
皆様はいかがお過ごしでしょうか?🤧

さて、今回は『Mayaのコンストレインを
効率化するスクリプト』をご紹介します!

アニマのリグ作業は基本的に、
mGearでカスタムステップを用いたワークフローです。
そのため、mGearコンポーネントだけではセットアップできない部分を
全てスクリプトに落とし込む必要があります。
コンストレインもその一つなのですが、過去には知識不足から
無駄な工程を多く含んだスクリプトを書いてしまったことも…😢

そこで今回は、そのリベンジも兼ねてフリップ対策を学びつつ、
汎用性が高く誰でも使いやすいスクリプトの作成を目指しました💪
※このスクリプトは複数の親からのコンストレインを適用するケースを想定しているため
「”parentA~Z”と”childA~Z”を1対1でコンストレインしたい」等の状況には不向きです。

興味のある方はお使いのスクリプトエディターに
コピー&ペーストしてご活用ください◎
————————————————–
import pymel.core as pm

def addNPO_alt(targetNode):
targetNode_p = pm.listRelatives(targetNode, p=True)
npoNode = pm.group(em=True, n=targetNode+”_npo”)
if len(targetNode_p) != 0:
pm.parent(npoNode, targetNode_p[0])
pm.matchTransform(npoNode, targetNode, pos=1, rot=1, scl=1)
pm.parent(targetNode, npoNode)
pm.select(cl=True)

# interpType -> 0 == No Flip, 1 == Average, 2 == Shortest, 3 == Longest, 4 == Cache
# skip -> None, “trans”, “rot”
def interpConst(parentList, childList, weightList, interpType=1, skip=None):
for child, weight in zip(childList, weightList):
tagC = pm.PyNode(child)
tagC_p = pm.listRelatives(tagC, p=True)
constC = pm.group(em=True, n=tagC+”_constC”)
if len(tagC_p) != 0:
pm.parent(constC, tagC_p[0])
pm.matchTransform(constC, tagC, pos=1, rot=0, scl=0)
pm.parent(tagC, constC)
addNPO_alt(constC)
for parent in parentList:
tagP = pm.PyNode(parent)
if len(pm.ls(tagP+”_constP”)) == 0:
constP = pm.group(em=True, n=tagP+”_constP”)
pm.matchTransform(constP, tagP, pos=1, rot=0, scl=0)
pm.parent(constP, tagP)
addNPO_alt(constP)
else:
constP = pm.PyNode(tagP+”_constP”)
const = pm.parentConstraint(constP, constC, mo=True)
pm.setAttr(const.interpType, interpType)
parentLength = len(parentList)
for i, w in zip(range(parentLength), weight):
pm.setAttr(const+”.w{}”.format(int(i)), w)
if skip == “trans”:
pm.disconnectAttr(const+”.ctx”, constC+”.tx”)
pm.disconnectAttr(const+”.cty”, constC+”.ty”)
pm.disconnectAttr(const+”.ctz”, constC+”.tz”)
elif skip == “rot”:
pm.disconnectAttr(const+”.crx”, constC+”.rx”)
pm.disconnectAttr(const+”.cry”, constC+”.ry”)
pm.disconnectAttr(const+”.crz”, constC+”.rz”)

parentList = [“parentA”, “parentB”, “parentC”]
childList = [“childA”, “childB”, “childC”, “childD”, “childE”, “childF”, “childG”, “childH”, “childI”]
weightList = [[0.88, 0.08, 0.04], [0.73, 0.18, 0.09], [0.57, 0.29, 0.14],
[0.41, 0.39, 0.20], [0.25, 0.50, 0.25], [0.20, 0.39, 0.41],
[0.14, 0.29, 0.57], [0.09, 0.18, 0.73], [0.04, 0.08, 0.88]]

interpConst(parentList, childList, weightList, interpType=0, skip=None)

————————————————–

【スクリプトの使い方】
編集が必要な部分は、parentList = [“parentA”, “parentB”, “parentC”] の行からです。

1. 親ノードの設定
parentList には、コンストレインの「親」となるノードの名前をリストで記入する。
1つ以上のノードを設定でき、多くの親ノードを指定することも可能です。

2. 子ノードの設定
childList には、
指定した親ノードから影響を受ける 「子」 ノードの名前をリストで記入する。
こちらも0でなければ個数の制限はありません。

3. ウェイトの設定
weightList には、親ノードから受ける影響の強さ(ウェイト)を設定する。
このリストは 「親の数 × 子の数」 の多重リストになっており、
parentList に記載した順番と対応させる必要があります。

4. interpType(回転の補間タイプ)の設定
interpType の値を変更することで、
コンストレインの回転補間の挙動を調整できます。
デフォルトは 1(Average)ですが、
おすすめは「0」(No Flip) です。
特にフリップが起こりにくいため、安定した挙動が期待できます。
このスクリプトでは、コンストレインを適用する
ノードの軸が揃う様にワールド軸のnullが生成されるため、
デフォルトの 1(Average) でも180度までは概ね問題ありません。

5. skip(除外設定)の活用
skip には、None・”trans”・”rot” の3種類があります。
None(デフォルト) → すべてのコンストレインを適用
“trans” → 移動のコンストレインを無効化
“rot” → 回転のコンストレインを無効化
あまり使用する機会は少ないかもしれませんが、
特定の動作を抑制したい場合にご活用ください。
————————————————–

以上、Mayaのコンストレインを効率化するスクリプトの紹介でした!
皆様の参考になれば幸いです:)

久々参戦!ジロ・デ・信州

3月もあっという間に下旬となり、
桜の開花も目前に迫る今日この頃🌸
皆様いかがお過ごしですか?

今回は、筆者も参加した【ジロ・デ・信州】の記事ですφ(..)

【ジロ・デ・信州】とは、アニメ業界の自転車愛好者が集まって
東京~長野間の約160kmをサイクリングするロングライドイベントです🚴
今回、アニマから数年ぶりに3名が参戦してきました!

「久々の参加、果たして完走なるか!?」
というプレッシャーもありましたが、スタート地点に来ると
仲間たちと走る楽しさと達成感を味わいたい気持ちが勝り、
やる気はMAX🔥

(スタート後↓)

(休憩中↓)

序盤は順調そのもので、「これはいけるのでは?」と
甘い考えが頭をよぎった矢先、柳沢峠が牙をむきました。
想像以上に厳しい道のりに
体力はじわじわと削られていき・・・

残念ながら筆者は完走ならず(泣)
でしたが、ゴール地点で仲間たちと再会した瞬間に
悔しさは一気に吹き飛び、「来年は完走するぞ!」
という闘志が沸き上がりました。

今回の最大の収穫は
「来年のリベンジに向けた決意」かもしれません。
サイクリング後はお楽しみのBBQ🍖
お互いの健闘を称え合いました👏

来年、完走を果たすために
日々のトレーニングを欠かさず頑張ります💪✨

それでは、次回の更新もお楽しみに🚴

Asset Div. Character Dept. の取り組み

3月に入りました🌸
卒業や入学・入社を控え、ソワソワわくわくする時期ですね!
アニマでも各所で新入社員の受け入れ準備を進めています✨

さて、今回は筆者(ムービー/キャラクターモデラー2年目)が
所属するAsset Div. Character Dept.で
昨年から実施している3つの取り組みをご紹介します。

■ 出社日の設定
こちらは昨年の9月から実施しており、
月末の所定日にチーム全員が出社する日を設けています。
所属スタッフの大半がリモート業務のCharacter Dept.ですが、
出社日には全員が顔を合わせてコミュニケーションを取ります。
新人の筆者にとっては、 先輩が業務を行う様子を見たり
自分の業務についてアドバイスをもらったりと
とても有意義でありがたい取り組みです φ(..)

■ カフェタイム
出社日の夕方、小休憩を兼ねて実施しました!
コーヒーやジュースを飲みながらドーナッツやスナックを食べ、
ワイワイと色々な話ができてとても楽しかったです☕
(個人的には定期的に実施希望…◎)

■ 雑談会
出社日とは関係なく、定期的に開催されています。
この会は、Asset Div.のスタッフであれば誰でも参加OKで
就業後にオンライン上で自由に集まります。
”雑談”という名前の通り、趣味や仕事関連、お互いの近況など
色々な話題を緩ーくお喋りする会です。
仕事中には聞けないプライベートな話も聞けるので、
先輩や同期の意外な一面を知ることができて楽しいです。
たまに皆でゲームをプレイすることもあります!

Character Dept.の雰囲気伝わりましたでしょうか?
今後新たな取り組みを始めたらまた紹介させていただきます!
それではまた次回*