Blenderはスクリプトで管理できるようになっているのですが、この学習方法が結構親切な設計になっていたので、今回はそれについて書こうかなと思います。
P ythonとは
Pythonとはインタプリタ言語で、Pythonがインストールされた環境であれば、そのままコードを実行できる仕様になっています。コンピューターは二値で動いているので、信号のオンとオフしか解らないので、機械語に近いアセンブラを使うしかありません。この条件で考えると、アセンブラを使ってコードを実行するしかないのですが、流石に値の変化だけで状態を理解するのは困難ですから、人間の言語に近い記述にした物を持ちる事になりました。その始まりはFortrunになりますが、その後、C言語なども登場し、人が見ても何をしているのかある程度判断が付くものになりました。しかし、この状態とバイナリーではアセンブラ以上に隔たりがありますから、翻訳しなければ実行できません。そこで、C言語などは、コンパイラで機械語に変換した状態で実行する形をとっています。なので、各OSには実行形式が存在しますが、コンピューターにわかるバイナリーの状態にする処理が存在する言語がコンパイル型言語と言います。
Pythonは常時インタプリタを使って処理をする方式になっていますから、BASICなどと同じようにインタプリタと言う翻訳機を使って常時翻訳をしながら実行している訳ですが、JITコンパイルなどが可能なので、BASICとは少し異なる仕様になっています。また、この特性はWEBブラウザ上でコードを実行しているJavaScriptでも行えるようになっています。
このように 【 コンパイルが不要で、Pythonがインストールされていれば、そのまま実行できる仕様 】 になっているので、気軽にコーディングを行って挙動を確かめる事が出来る物になっています。
B lenderとPython
Blenderでは、
■ アドオン
■ スクリプト
の双方がPythonで記述できるので、Pythonでオブジェクトの生成やオブジェクトの移動やアニメーションの設定ができます。
Blenderでは、bpyを使って処理を行っているのですが、これは、外部ライブラリや標準モジュールと同じで、Pythonの組み込み関数では実装されていない物になります。その為、Blenderの機能を使おうと思った場合、bpyを使う事になります。
ちなみに、BGRがある場合には、bgeを読み込んで処理をしていましたが、UPBGEもコードで制御をする(この場合、コントローラーでモジュールを実行するように指定します。)仕様になっています。
そして重要なのは、 【 Pythonの機能は基本的に使用できる 】 ので、拡張モジュールで実装した物の数値の部分は変数化できるので、その数値の変動をPythonの標準モジュールなどで拡張して動かす事が出来るようになっています。
B lenderのbpyを使う
Blenderを開くと、
のような画面になっていますが、画面上部の 【 Scipt 】 のタブをクリックすると、コーディングが行えるワークスペースに切り替わります。
切り替えると、
のように3ペインの画面が登場します。この左側ですが、最上部には、
のようにビューポートが用意されており、その下には、コンソールが表示されます。
そして、その下には、その処理によって実行されたコードが表示される仕様になっています。
中央はコードを記述する部分になりますが、
のようになっており、画面上部には、
のようなメニューがあり、中央には、
のように新規作成をするボタンと外部参照をする為のボタンが用意されています。
右のペインの上部にはアウトライナーがあり、
その下には、
のような物が用意されていますが、ここからドロップした物がそのままコードに記述される仕様になっているので、
のようにドロップすると、コードに反映されます。
これは、変数aに対して、CUBEオブジェクトを指定しているので、CUBEに対して何かをする際の変数の宣言方法になります。
そして、その下がオブジェクトのプロパティになります。
ここの項目もbpyで制御できるので、数値の変化を入れる事が出来ます。
■ コーディングを行う
コーディングですが、 【 CTRL 】 + 【 ホイール 】 の操作でサイズの変更ができます。
そして、
のような感じでコードを書いたら、メニュー内のテキストをクリックして、その中の 【 名前を付けて保存 】 を選択して、ファイルとして保存する必要があります。これは、テクスチャ制作時の画像の保存にも言える事ですが、保存をしない場合にはあくまでも、メモリー内に記録されているだけなので、Blenderを終了させるとデータが消えてしまいます。
その為、コードやテクスチャのフェイクユーザーの状態ではコードの再利用が出来ませんから、必ずファイルとして確定させておく必要があります。
このワークスペース内で作業をしていると、
のように処理がその都度表示されるので、これを見て処理を実行するとその内容をそのままコードで実行できるようになります。また、コンソールは、Pythonと同じで、そのまま入力が出来るので対話型の処理が行えるようになっています。
ちなみに、CUBEを新規作成してみると、
のようなコードが出てきたのですが、ここで 【 CTRL 】 + 【 C 】 でコピーをして、エディタ側で、 【 CTRL 】 + 【 V 】 で張り付けると
のようにコードを追加できます。この処理を見ると、先頭がbpyなので、使用できるようにコードの最初にbpyをインポートする記述を追加します。
■ コードを書く
とりあえず、
のようなコードを書いて
のように何もない状態で実行すると、
のように立方体が生成され、
のように座標に異なる巣値が配置されてた状態で実行されています。そして、アウトライナーにも立方体が複製されています。
コード内に無駄な変数がありますが、実際には、
のような簡素なコードで、先程の状態を作る事ができます。
■ コードの解説
のコードですが、最初に
のようにbpyを読み込んでいます。これは、外部ライブラリなので、読み込まないとPythonで実行できないのでコードの戦闘で読み込んでいます。ちなみに、Pythonでは、外部ファイル自体をimportで読み込める仕様になっているのでPythonファイルの内容を実行したり、その中の関数やクラスを呼び出して使用することもできます。
次に
のように標準ライブラリのrandomを読み込んでいます。これは乱数を発生させるライブラリになりますが、これも処理の前に読み込まないとエラーになります。
次に、ループ用の変数を読み込んでいます。
ここがループ回数になるので、実質的に、発生させるオブジェクトの個数になります。そして、ここからが処理の部分になります。
今回は複数個の立方体をランダムで配置するので、forループを用意しました。ループ回数は最初に宣言した変数lpを代入しています。
この記述によって、変数Xにlpまでの数値が追加されることになります。次に変数内に乱数の幅の指定で使用する変数を指定します。
この数値を変えると、立方体の生成される位置の範囲が変わります。
そして、
のように乱数を使って、範囲を指定して、それを変数に格納します。今回はLocateの各座標なのでlを加えた座標軸の名称にしています。
ここでの乱数は、int型にしているので、randintを使っています。これで整数の乱数を取得できるようになります。パーセンテージのような物だとrandomを使い、範囲内の整数+小数点数の範囲だとuniformを使う事になります。
これで乱数が出来上がったので、
のようにオブジェクトの生成をする処理のlocationに対して変数を配置すると、ループ内で変数の変化が発生するので、異なる場所にオブジェクトが生成されるようになります。
■ コードの仕様
今回のコードは、
のようになっていますが、bpyを使っているのは、
の部分だけで、残りの部分はPythonの標準実装機能になります。その為、 【 生成 】 の部分がbpyに依存した作りになっており、その処理において変数化が可能な部分を変数にして、その変数の制御部分をPythonで行っている形になります。その為、コードの作り方としては、
■ Pythonの部分
■ 変数の宣言
■ 関数の生成
■ クラスの生成
■ 条件分岐
■ ループ
■ クラスやライブラリの外部参照
■ 外部ライブラリの利用
などの制御系全般
■ bpyの部分
■ オブジェクトの生成
■ オブジェクトの制御
■ シーンの制御
■ ダイナミクスの制御
■ マテリアル関連
■ レンダリング関連
■ アニメーション関連
のようにBlenderの実装機能全般
を扱う事になります。その為、
■ 機能を用意して
■ Pythonで制御する
と言う形になります。その為、事前に行う処理を考えて置き、そのコードを用意して、動作に必要な部分を変数化すれば、数値の変動で状態を変える事が出来るようになります。
■ コードの応用
このように 【 挙動 】 の中の定数部分は変数として扱う事が出来るのですが、この処理では、
■ 場所 : Location
■ 規模 : Scale
の調整が出来るようになっています。その項目を見ると
のscaleの部分も定数でいs呈されていますから、ここも変数にすることができます。コードを
のように変更すると、
のように形状に変化が発生します。これは、同じ乱数を使った物になりますが、このを変数を変更して、
のように分けると、別の数値で管理できるようになりますが、この状態で実行すると、
のようになります。変数を独立させると、数値の変更が出来るので、
のようにすると、
のようにランダムで形状の異なる直方体の組み合わさった形状を作る事が出来るようになります。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ 今回使った環境
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ PC環境
■ Core i5 650(2コア/4スレッド 3.2GHz)
■ ASROC H55M-Pro
■ DDR3 1333 1GBx2 + 2GBx2 (Dual Channel)
■ ELSA Quadro K620 【 PCIex16(GEN2) DDR3 2GB 】
■ HGST HDD & WD HDD
■ WINDOWS 10 x64 (21H1)
■ ソフトウェア
■ Blender 3.0