体のコントローラの値はすべて同じ値が入っているべきだと思っているので、そうなるようなスクリプトをChatGPTくんに作ってもらいました。 内容としては、 アーマチュア(PoseMode)の選択しているコントローラ(ボーン)のXYZの回転(オイラー)がズレている場合平均値を代入してくれるというものです。 Mayaと違って複数ボーンに同じ値を入れるのが結構めんどい(Alt押しながらEnter)ので。 PoseModeじゃないといけなかったり、選択しているキーフレームを取得するのが難しかったりしたので現在のフレームを対象としています。 import bpy import math # アクティブなオブジェクトを取得 active_object = bpy.context.active_object # オブジェクトが存在し、Poseモードであることを確認 if active_object and active_object.mode == 'POSE': # アクティブなポーズのフレーム番号を取得 frame_current = bpy.context.scene.frame_current # 選択されているボーンのリストを取得 selected_bones = [bone for bone in active_object.pose.bones if bone.bone.select] # ボーンごとの各軸回転の合計を初期化 total_rotation_x = 0.0 total_rotation_y = 0.0 total_rotation_z = 0.0 for bone in selected_bones: # ボーンの各軸回転を取得し合計に加算 total_rotation_x += bone.rotation_euler.x total_rotation_y += bone.rotation_euler.y total_rotation_z += bone.rotation_euler.z # 各軸の回転の平均値を計算 average_r
某社のスクリプトを使用していて、ロケーターからもとのオブジェクトに戻すとき(ベイクするとき)にタイムラインの範囲外のキーが消えてしまいます。
これを消えないようにちょっと改造します。Pythonで書かれているのですが、ついでにどのように調べたかも書いてみようと思います。
とりあえず書き足す内容
「.py」の拡張子のファイルを開き、returnBake():という関数が定義されているところのbakeResultsコマンド、
これにオプション「
preserveOutsideKeys = True」を付け足し以下のようにします。オプションは最後に書くようにしてください
cmds.bakeResults(attList, t=(startF,endF), simulation=bs, sampleBy=(sbtime),preserveOutsideKeys = True )
注意点としては、Pythonでは「True」の「T」を大文字にしないとエラーになります。
こういう場合の調べ方
MayaのPythonのコマンドはMELに比べて調べづらいです。なぜなら、スクリプトエディターにログとして出てくるコマンドはすべてMELだからです。(Pythonに変更できるのであればぜひ教えてほしいです。)
で、今回の場合は「範囲外のキーを削除しないようにする」というのが目的だったわけですが、どのコマンドがそれを行っているか検討を付ける必要があります。
おそらくBakeという名前のつくコマンドだろう、と思ったのでとりあえず検索をし、それっぽい行を見つけたら「#」を行頭に追加してコメントアウトして試してみます。
(ちなみにMayaを起動した状態でスクリプトフォルダの内容を変更したときにMELで
そして、上記のコマンドをコメントアウトしたら範囲外のキーが削除されなかったので、これのリファレンスのページを探します。
「探したいコマンド python maya」という感じで検索すれば出てきます。
で、先程書いたpreserveOutsideKeysも当然書いてあるのですが、
こういうときは、とりあえずMayaのメニューから実行します。
bakeResults -simulation true -t "0:100" -sampleBy 1 -oversamplingRate 1 -disableImplicitControl true -preserveOutsideKeys true -sparseAnimCurveBake false -removeBakedAttributeFromLayer false -removeBakedAnimFromLayer false -bakeOnOverrideLayer false -minimizeRotation true -at "tx" -at "ty" -at "tz" pSphere2;
望んだ動作をしていることを確認し、ログを見ます。するとこんな感じのコマンドが出てくるので、それっぽいオプションを探します。
MELとPythonはオプションの書式が違うだけで、オプションの名前自体は同じなのでこの調べ方でいけます。
先程のページで説明文を読んでみると、初期値はFalseなので削除するのが初期値だとわかります。なので、Trueに変更して終了。
コメント
コメントを投稿