組んだボーンの中で、赤いものには全てStretch Toコンストレイントを設定しています。
伸びると引き締まり、縮むと膨らむ、まるで筋肉のようなコンストレイントです。
伸びると引き締まり、縮むと膨らむ、まるで筋肉のようなコンストレイントです。
このコンストレイントはボーンをエディットモードで編集したあとポーズモードに戻るとズレてしまいます。このズレを修正するためにあるのがStretch ToコンストレイントのResetボタン。
これが一つ二つ三つならいいのですけど、何十にもなってくるとリセットし忘れることもあってめんどくさい!
そこで一度にリセットできる方法はあるのかググってみると…
blenderartistsのフォーラムにスクリプトを使ってリセットする方法がみつかりました!
フォーラムに書かれてある
import bpy
for b in bpy.context.selected_pose_bones:
for c in b.constraints:
if c.name == "Stretch To":
c.rest_length = 0
このスクリプトをText Editorに貼りつけてRun Scriptボタンを押せば、選択中のボーンにあるStretch Toが全てリセットされます。これは楽ちん!!
スクリプトの処理内容。
#①bpyモジュールを読み込み、(blender pythonの略?)
import bpy
#②選択されたボーンの中で一番目のボーンを変数"b"へ入れ、
for b in bpy.context.selected_pose_bones:
#③"b"が持つ一番目のコンストレイントを変数"c"へ入れ、
for c in b.constraints:
#④"c"のコンストレイント名が"Stretch To"であれば、
if c.name == "Stretch To":
#⑤rest_lengthを0(Reset)にする!
c.rest_length = 0
#二番目、三番目…のコンストレイントがあれば③へ戻り、
#無ければ②へ戻り、二番目、三番目…最後のボーンまで繰り返し。
Pythonはまだ組んだことがありませんでしたが、for文・if文はプログラミングの基本ですのでこんなところかなと思います。
便利になりましたけど、どうせならText Editorからではなく、ボタン一発でリセットできるようにしたいですよね。
ボタン化させるにはどうすればいいのかわからずまたググってみると…
アドオンのテンプレートを公開されている蜩の硯さんのサイト
アドオンの作り方を公開されているnuttiさんのサイト
を参考にしてボタン化したアドオンを作成することができました!
有難うございます!m(_ _)m
テンプレートはフォーラムのスクリプト実行させるだけですのでボタン一つのもの(my_simple_addon_template.py)を使用させていただきました。ためしにText Editorからそのまま実行します。
ボタンを押しても何も起きない?と思ったら、Sysem Consoleウインドウにボタンを押した回数だけ"Hello World!"が表示されました。テンプレートの中にある"print"はSystem Consoleウインドウに文字を表示するようです。Info > WIndow > Toggle System Consoleからウインドウを出すことができます。
このテンプレートは、ツールシェルフにパネルとボタンを表示し、パネル名が"XXXX"、ボタンのラベルが"XXXX"、ボタンを押すと"Hello World!"を表示することがわかりましたので、はじめに出てきたスクリプトに合うよう修正しました。
以下が修正した後です。
import bpy
# Info
bl_info = {
"name": "Reset Stretch To constraints",
"author": "Ponkotsu",
"version": (1, 0),
"blender": (2, 78, 0),
"location": "View3D > Toolbar > Toolstab",
"description": "Reset all the Stretch To constraints in the selected bones",
"warning": "",
"wiki_url": "",
"tracker_url": "",
"category": 'Rigging'
}
# Menu in tools region
class ResetStretchToPanel(bpy.types.Panel):
bl_label = "Reset Stretch To constraints"
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_category = "Tools"
def draw(self, context):
self.layout.operator("reset.stretch_to")
# Main
class ResetStretchTo(bpy.types.Operator):
bl_idname = "reset.stretch_to"
bl_label = "Reset"
bl_description = "Reset all the Stretch To constraints in the selected bones"
bl_options = {'REGISTER'}
def execute(self, context):
for sbone in bpy.context.selected_pose_bones:
for sbcons in sbone.constraints:
if sbcons.name == "Stretch To":
sbcons.rest_length = 0
return{'FINISHED'}
# Registration
def register():
bpy.utils.register_class(ResetStretchToPanel)
bpy.utils.register_class(ResetStretchTo)
def unregister():
bpy.utils.unregister_class(ResetStretchToPanel)
bpy.utils.unregister_class(ResetStretchTo)
if __name__ == "__main__":
register()
アドオンの登録情報がありますのでBlenderのUser Preferences > Add-onsからインストールすることができます。
簡単に説明すると、、、
Infoではアドオンの情報(アドオン名、作者、説明など)を記述。
# Info
bl_info = {
"name": "Reset Stretch To constraints",
"author": "Ponkotsu",
"version": (1, 0),
"blender": (2, 78, 0),
"location": "View3D > Toolbar > Toolstab",
"description": "Reset all the Stretch To constraints in the selected bones",
"warning": "",
"wiki_url": "",
"tracker_url": "",
"category": 'Rigging'
}
Menu in tools regionでは画面のどこにボタンを表示するかを記述しています。
"ResetStretchToPanel"がクラス名、"bl_label"がパネル名、
"bl_space_type"と"bl_region_type"と"bl_category"が表示する場所です。
"VIEW_3D(3d View)"の"TOOLS(ツールシェルフ)"の"Tools(Toolsタブ)"となっています。
"draw"が表示関数です。"self.layout.operator"がボタンを押したときの処理を呼び出し、カッコ内には"処理をするクラスのbl_idname"を指定しています。
# Menu in tools region
class ResetStretchToPanel(bpy.types.Panel):
bl_label = "Reset Stretch To constraints"
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_category = "Tools"
def draw(self, context):
self.layout.operator("reset.stretch_to")
Mainはアドオンの処理内容を記述した中核となる部分です。
"ResetStretchTo"がクラス名、"bl_idname"がID名、"bl_label"がボタンのラベル、
"bl_description"がツールティップに表示する説明文です。
先ほどMenu in tools regionで"self.layout.operator("reset_stretch_to")"
がでてきました。このクラスのid_nameを指定していたことになります。
"execute"以下はこのクラスが呼び出されたときに実行する処理内容となっています。
変数名を変えていますが、フォーラムのスクリプトと同じですね。
処理が成功すると"FINISHED"を返すみたいですが、
どこへ返すのかはわかりませんでしたorz。どこだろう?
# Main
class ResetStretchTo(bpy.types.Operator):
bl_idname = "reset.stretch_to"
bl_label = "Reset"
bl_description = "Reset all the Stretch To constraints in the selected bones"
bl_options = {'REGISTER'}
def execute(self, context):
for sbone in bpy.context.selected_pose_bones:
for sbcons in sbone.constraints:
if sbcons.name == "Stretch To":
sbcons.rest_length = 0
return{'FINISHED'}
Registrationではアドオンをインストール・アンインストールしたときの処理を記述します。定義したクラスをregister(登録)・unregister(登録取り消し)しています。
最後のif文はまだよく分かっていませんので省略します(笑)。ここはあまり気にしなくてもよさそうです。
# Registration
def register():
bpy.utils.register_class(ResetStretchToPanel)
bpy.utils.register_class(ResetStretchTo)
def unregister():
bpy.utils.unregister_class(ResetStretchToPanel)
bpy.utils.unregister_class(ResetStretchTo)
if __name__ == "__main__":
register()
ほとんど組み合わせただけのものになってしまいましたけど、それでもインストールして実行できた時は嬉しいものですね。テンプレートはText Editor > Templates > Pythonにもありました。また必要となれば作成してみたいと思います。
Pythonはまだまだわからないことばかりなので、もし、間違っているところがありましたら教えていただけると助かります!
需要があるかわかりませんが使ってみたい方はこちらからダウンロードしてください。
reset_stretch_to_constraints.py