ルービックキューブ生成スクリプト

はじめに

ルービックキューブを生成するスクリプトを作成したので、 コードと使用方法をまとめます。

スクリプトを実行すると、キューブオブジェクトやボーン生成から、 マテリアル設定、ベベルモディファイア(角の丸め)適用、アニメーション設定まで一括で行います。

動作の様子は以下の動画を確認してください。

(BlenderはVer.2.77を使用しています)


注意事項

本ページの内容を実行する際は、すべて自己責任でお願いします。

スクリプト実行手順

まずはBlenderを起動し、メニューの「オブジェクト > 削除」をクリックし、 中央のキューブを削除します。


スクリーンレイアウトをScriptingに変更し、 この記事にあるGistローダーで ユーザーID「TakosukeGH」、キーワード「#rubix_cube_script」と入力してスクリプトを取得するか、 こちらから直接スクリプトをコピーしてBlenderにペーストします。
(ファイル名は何でもOKです)


テキストエディタを右クリックし、「スクリプト実行」を選択します。 処理が成功するとルービックキューブが生成されます。

スクリーンレイアウトをDefaultに戻し、 再生ボタンをクリックするとスクリプトで生成したアニメーションを確認できます。


以上でスクリプトの実行手順はおしまいです。


回転の設定

今回はスクリプトファイルに日本語コメントを多く記述したので、 設定についてはそちらをご確認ください。 ここではコメントで説明しきれていない「回転データ」について補足します。

ルービックキューブは、回転パターンを解説するために回転記号というものが使われています。 Wikipediaのルービックキューブの項目に 詳細が記述されていますが、 回転させる層に合わせてF・B・R・L・U・D・S・M・Eの記号が用いられます。

単に「F」と書いた場合は時計回りへ90°回転させることを意味し、 反時計回りに90°回転させる場合は「F’」と記述します。 本スクリプトでも同じ記号を使用しますが、 回転については「n」と「r」という記号を使用します。 「n」はnormalの頭文字で、時計回りの回転と対応します。 「r」はreverseの頭文字で、反時計回りの回転と対応します。

文字だけだと分かり辛いので、 設定値とアニメーションの具体例をいくつか挙げます。

時計回りの回転

まずは時計回りの全ての回転を確認します。

1
2
3
4
5
6
7
8
9
10
11
move_data = [
(mn.F, rd.n),
(mn.B, rd.n),
(mn.R, rd.n),
(mn.L, rd.n),
(mn.U, rd.n),
(mn.D, rd.n),
(mn.S, rd.n),
(mn.M, rd.n),
(mn.E, rd.n),
]

スクリプトの43行目を、上記のように記述します。 回転記号を記述する際はmn.Fのように、 先頭にmn.を付けて記述します。 同様に回転方向はrd.を付けます。

上記の設定の場合、キューブの回転は以下の様になります。

反時計回りの回転

回転方向をnからrにすると、反時計回りの回転になります。

1
2
3
4
5
6
7
8
9
10
11
move_data = [
(mn.F, rd.r),
(mn.B, rd.r),
(mn.R, rd.r),
(mn.L, rd.r),
(mn.U, rd.r),
(mn.D, rd.r),
(mn.S, rd.r),
(mn.M, rd.r),
(mn.E, rd.r),
]

ランダム回転

適当に動かしたい場合は、以下のコードを使用することができます。 range(30)が回転回数を表し、指定した回数だけランダムに回転します。

1
2
3
self.move_data = []
for i in range(30):
self.move_data.append((random.randint(1,9), random.randint(0,1)))

上記のコードは、スクリプトの80行目にコメントアウトした状態で記述しています。 コードのインデントに気を付けながら、先頭の#を削除して実行してください。

実行結果は以下です。
(ランダムなので毎回動作が変わります)

回転のパターンによっては捩じれたような回転をしてしまう場合があります。 その場合は手動で修正してください。

MMDでの使用

本スクリプトで生成したルービックキューブを、 pmxエクスポーターとvmdエクスポーターを使用してMMDで使用することが出来ます。

実際にMMDで使用した動画はこちらです。

ここでは、ルービックキューブの生成からMMDで使用するまでの手順をまとめます。

ルービックキューブの生成

上記のスクリプト実行手順と同じ手順でキューブを生成しますが、 ここではスクリプト38行目をscale = 0.1に設定し、 小さめのキューブを生成します。 また、回転はランダム回転を使用します。

pmxエクスポーターのインストール

ここではpmxエクスポーターとして、かがやすさんのBlender2Pmxeを使用します。 こちらのサイトから Ver.1.0.6をダウンロードし、Blenderのアドオンフォルダに配置、 そしてBlenderのユーザー設定でアドオンを有効化します。

アドオンをインストールする方法は こちら の記事が詳しいです。


pmxファイルのエクスポート

アドオンを有効化したら、ルービックキューブのアーマチュアを選択し、 メニューの「エクスポート > PMXファイル for MMD(機能拡張版)(.pmx)」を選択します。 出力ファイルを指定する画面で、 左下にある「モディファイアーを適用」にチェックを入れてエクスポートします。


pmxの編集

生成されたpmxをPmxEditorで開き、 Indexのコピー&ペーストを利用して表示枠を修正します。 表示枠の設定は自由ですが、 ここではBone以外の全てのボーン(Bone.001~Bone.026)を「その他」表示枠に設定します。


これでルービックキューブモデルがMMDで使用出来るようになります。 つづいてモーションデータ(vmd)をエクスポートします。

vmdエクスポーターのインストール

Gistローダーを使用する場合は、 ユーザーID「TakosukeGH」、キーワード「#vmd_export_script」と入力して、 「vmd_export_script.py」「config.ini」を読み込みます。 もしくはこちらの記事からスクリプトと設定ファイルをコピーし、 Blenderのテキストエディタにペーストしてください。

config.iniは以下のように出力パスとボーン名記述します。 出力パスは環境に合わせて適宜変更してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[config]
folder : D:\MMD\tmp
file : sample.vmd

[bone]

Bone.001
Bone.002
Bone.003
Bone.004
Bone.005
Bone.006
Bone.007
Bone.008
Bone.009
Bone.010
Bone.011
Bone.012
Bone.013
Bone.014
Bone.015
Bone.016
Bone.017
Bone.018
Bone.019
Bone.020
Bone.021
Bone.022
Bone.023
Bone.024
Bone.025
Bone.026

[bone_isolated]


vmdエクスポート

先にBlenderの開始フレーム、終了フレームを調整し、 キューブのアニメーションがすべて再生範囲内に収まるようにします。

キューブのアーマチュアを選択し、vmd_export_script.pyを実行します。 エクスポートが成功すると、指定したパスにvmdファイルが生成されます。


動作確認

エクスポートしたpmxファイルとvmdファイルをMMDに順に読みこみ、 再生ボタンをクリックするとBlenderと同じような動きをすることが確認できます。

以上でMMDで使用するための手順はおしまいです。


おわりに

今回のスクリプトはやっていることは一つ一つシンプルです。 面倒な処理を自動でやるときの一つの例として見ていただければ幸いです。

「その機能、Blenderでも出来る」と言うだけでなく、 「Blenderの方がやり易い・早い・かっこいい」と言えるようなものがどんどん増えると嬉しいですね。

何かありましたら@takosuke_twまで連絡ください。


付録・アニメーションの逆再生

本スクリプトで作成したキューブは、 初期状態は(大抵は)面がすべてそろった状態になります。 アニメーションを再生すると、 そろった状態からシャッフルされた状態に移行します。

しかし動画で使う場合は、シャッフルされた状態から元に戻すのが普通です。 そこで、ここでは生成したアニメーションを逆再生させる手順をまとめます。
(NLAエディタを使用するので、詳しくはこちらを 参照してください)

アクションストリップの作成

スクリーンレイアウトをAnimationに変更し、 どこか適当なエリアをNLAエディターに変更します。 NLAエディタ上に「RubixCubeAction」が表示されているので、 その隣のボタンをクリックします。


すると一段下に黄色い帯が生成されます。これがアクションストリップです。 Blenderではストリップを使用し、モーションの再利用やリピート、逆再生をすることが出来ます。


反転再生

NLAエディタのメニューの「ビュー > プロパティ」をクリックすると、 右側にプロパティが表示されるので、 そのなかの「反転再生」にチェックを入れます。

この状態で再生すると、シャッフルされた状態から元に戻すアニメーションになります。


その他の方法

上記以外にも、キューブ生成時に「シャッフル状態→元に戻す」アニメーションを生成することができます。 スクリプトの40行目にあるプロパティを、以下の様に設定すると、 通常とは逆の動きをするようになります。

1
2
3
frame_start = 500
frame_rotate = -5
frame_interval = -5

本スクリプトは、frame_startからキーフレームを追加し始め、 frame_rotate分フレームを進めた後にキューブを回転させ、 またキーフレームを追加します。 さらにframe_interval分フレームを進め、 そこでキーフレームを追加して1サイクルとなります。

そのためframe_rotateframe_intervalに 負の値を設定すると、 フレームを進めるのではなく戻すようになり、 通常とは逆のアニメーションを生成することができます。
(ですので負の値を設定する場合は、frame_startに大き目の値を設定してください)


編集履歴

  • 2016/07/10 : 記事公開