2011年10月31日月曜日

Blender:Pythonスクリプト:オブジェクトを連続的に動かす

Text Editorで次のようなプログラムを書いてAlt+Pを何度も押すと少しずつCubeが動きます。

import bpy

bpy.data.objects["Cube"].location += Vector((1.0,0,0))

ところがこれを連続的に動かして、アニメーションのように見ようとして

import bpy
from mathutils import *
import time

print('start******************')

duration = 0.3
time.sleep(duration)

for i in range(10):
    bpy.data.objects["Cube"].location += Vector((1.0,0,0))
    time.sleep(duration)

としてもCubeは連続的に動かず、Alt+Pを押してからしばらくしていきなり(10,0,0)の位置に動いてしまいます。スレッドで動かせばいいのかと思い、下のようにしましたが、これでもだめです。

import bpy
from mathutils import *
import time
import threading

print('start******************')


class test(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self.i = 0

    def run(self):
        print("Thread Start.")
        bpy.data.objects["Cube"].location = (0,0,0)
        duration = 0.3
        time.sleep(duration)
       
        for i in range(10):
            bpy.data.objects["Cube"].location += Vector((1.0,0,0))
            time.sleep(duration)
       
        time.sleep(1)

        for i in range(10):
            bpy.data.objects["Cube"].location -= Vector((1.0,0,0))
            time.sleep(duration)

if __name__ == "__main__":
    t = test()
    t.start()
    time.sleep(30)

Cubeが動くごとにRedrawとかするのでしょうか?

と思って調べたらRedrawはしない方がいいみたいです。ここ

Tools that lock Blender in a loop and redraw are highly discouraged since they conflict with Blenders ability to run multiple operators at once and update different parts of the interface as the tool runs.

とあり、

So the solution here is to write a modal operator, that is - an operator which defines a modal() function, See the modal operator template in the text editor.

modal operatorを使うのが推奨されています。ということで今後modal operatorを調べることにします。

2011年10月29日土曜日

Blender:Pythonスクリプト:Python Console

BlenderではPythonのInteractive環境をPython Consoleで実行できます。


 一番下のパネルの左下のEditor選択メニューでPython Consoleを選びます。


するとこのようなPython Consoleが開きます。このチュートリアルにあるように順に試していきます。


>>> bpy.data.objects

>>> list(bpy.data.objects)
[bpy.data.objects['Camera'], bpy.data.objects['Cube'], bpy.data.objects['Lamp']]


bpy.data.objects['Cube'].l と入力した所でCtrl+Spaceを押すと下のように候補が表示されます。

>>> bpy.data.objects['Cube'].l
                              ayers
                              ibrary
                              ocation
                              ock_location
                              ock_rotation
                              ock_rotation_w
                              ock_rotations_4d
                              ock_scale

さらに

>>> bpy.data.objects['Cube'].loca

まで入力して選択肢が1意になるようにして、Ctrl+Spaceとすると location と自動入力されます。

>>> bpy.data.objects['Cube'].location
Vector((0.0, 0.0, 0.0))

となります。今度はここに値を入れてみます。

>>> bpy.data.objects['Cube'].location = (0.0, 2.0, 4.0)

とすると、図のようにCubeが動くことが分かります。これでPythonでBlender内のオブジェクトを動かすことが出来るようになりました。



2011年10月22日土曜日

Blender:インタフェース

Blenderのチュートリアルビデオを見ていて面白かった使い方を3点。

BlenderのWindowをDuplicate。Ctrl+Alt+WでBlenderのWindow全体が2つになります。同じWindowが2つできるということです。下の図は2つになったWindowの一方をずらして、片側の3Dパネルの中のCubeオブジェクトを動かしている様子です。一方を動かせば他方も動きます。すなわち、この2つのWindowでBlenderの1つのGUIを構成していることになります。ですので、2ディスプレイの人などは便利に使えるのではないでしょうか。


またWindow全体でなく1つのパネルだけをDuplicateすることもできます。下のようにDuplicateしたいパネルの左下の部分にマウスカーソルを持って行くと、マウスカーソルが+に変わりますので、この状態でShiftを押しつつ左マウスクリックしてそのままちょっとドラッグするとそのパネルがDuplicateされます。このパネルもBlenderの1つのGUIとして動きますので一方でオブジェクトを動かしたら他方も動きますし、一方のパネルをPropertiesなどにして変更を加えたらその変更が他方にも及びます。


これ以外にもCtrlを押しながら同様の操作をすると、


のようなマークが現れ、クリックをしたパネルから入れ替えをしたいパネルへドラッグをすると対象の2つのパネルを入れ替えることが出来るようです。
 

Blender:Pythonスクリプト

Blender内でPythonスクリプトを動かしていきます。Blender内のいろいろな物(Object)はPython言語で動かすことができます。これをやっていきます。Blender + python 備忘録を参考にして進めます。ここはBlender2.45をベースに説明されているので、これを2.6で出来るように説明します。

まずBlender2.6でPythonスクリプトを書くエディタを開きます。右側のWindow枠を少し大きくして、Text Editorを選びます。


すると下のようなText Editorが開きます。


メニューのText→Create Text Blockを選ぶと入力できるようになります。


とりあえず Hello Worldに従ってPythonでHello Worldを書いてみます。Blender2.5からPythonがv3を使うようになったので、書き方がちょっと違います。Python3からは関数型で書かないといけなくなってので、

print  'Hello World'  を
print('Hello World')

と書き換えます。Text Editor内に次のように書き込みます。


Blender2.5以降ではSystem Console(標準出力)が標準では閉じられているので、Help→Toggle System Consoleで出します。


System Consoleはこんな感じ。別Windowで開きます。


Blenderの画面に戻ってText Editor上でAlt+Pと押すと、System  Consoleに実行結果がこのように出ます。


無事Pythonが実行できました(^^V

2011年10月20日木曜日

Blender:Blender 2.60

2.60正式版が出ました。今度はちゃんと2.60という表示になっていますね。

Blender:Game Engine: TutorialをBlender2.5以降で実行してみる(その5)

Blender:Game Engine: TutorialをBlender2.5以降で実行してみる(その4)で「このままでは球が平面に落ちてそこでピタっと止まってしまいます。」と書きましたが、実はバウンドしていたようです。球をもっと持ち上げて落としてみるとバウンドしているのが見えます。後はパラメータ調整で実際に近づけるのでしょうか。

2011年10月16日日曜日

Blender:Game Engine: TutorialをBlender2.5以降で実行してみる(その4)

前回に続けて、Blender Game EngineのTutorialを見ていきます。Blender2.5以降での変更点を中心に見ています。

Making the default cube move, using physics


に進みます。この節ではBulletというBlenderに組み込みの物理演算エンジンを使います。物理演算エンジンを使うと重力に従った物体の落下などのシミュレーションが出来ます。

Blenderを立ち上げて、デフォルトのCubeを消して、UV Sphere(球)を作ります。物理演算エンジンを使うためには下のような設定をします。


こうしておいて3DパネルでPキーを押すとめでたく球が下の方へ落ちて行くのが見えます。無事に重力が働いたようです。

で、このままでは球はどんどん落ちて行くだけなので、下に球を止める平面を作ります。Add→Mesh→Planeで平面を出します。


図のように設定して、3DパネルでPキーを押すと、球が落下して平面で止まるのが確認できます。Scaleは平面を右クリックで選択している時にSキーを押してマウスを動かすことでも実行できます。

このままでは球が平面に落ちてそこでピタっと止まってしまいます。ホントはバウンドさせたいのですが、このTutorialに従って進みます。(バウンドもまだ僕がうまくできないこともあり(^^;)


図のように球を選択して、Logic Editorを選び、Touchセンサ、Addコントローラ、MotionアクチュエータでForceを設定します。Touchセンサは球が他のオブジェクトと接触しているときにトリガを送り、Addコントローラを介して、Motionアクチュエータを駆動します。これでPキーでGEを実行すると、球が平面に落ちて、それから球がY方向に転がっていくのを見ることができます。

後はTutorialに従って適当に遊んでください(^^V