ラベル Blender の投稿を表示しています。 すべての投稿を表示
ラベル Blender の投稿を表示しています。 すべての投稿を表示

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

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

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

Making the default cube move, using no physics


に進みます。この節からようやくオブジェクトを動かしていきます。

前回の CubeオブジェクトのロジックブロックのActuatorに指定したMotionに何か設定してみます。例えば図のようにY:0.1としてみます。これ はY方向(Cubeに付随するローカル座標)にそって0.1ずつ動けということになります。ActuatorパネルのY方向を指定するLocのところの一 番右のLのところをクリックするとローカル座標とグローバル座標が切り替わります。ローカル座標が指定されているときはオブジェクトの向きによってグロー バル座標系での方向が変わります。グローバル座標ならオブジェクトの向きにかかわらず、同じ方向となります。


ここで3Dパネルにカーソルを置き、PキーでGEを起動しましょう。すると、



キューブがどんどん右側(Y方向)に遠ざかっていくのが見えます。このようにGEでオブジェクトを動かすことが出来るようになりました(^^V

これではどんどん行ってなくなってしまうので、キーボードからコントロールできるようにしましょう。


ロジックパネルをCtrl+↑で最大化して図のように↑矢印にはY方向、↓矢印には-Y方向、→矢印にはZ軸正方向回転、←矢印にはZ軸負方向回転を割り付けます。これでCtrl+↑でロジックパネルを小さくして、3Dパネル上でPキーを押すとGEモードになり、そこで↑↓→←のキーをいろいろ押すとそれに合わせてCubeオブジェクトが動きます。↑と→を同時に押すとZ軸正回転しながらローカルY軸正方向に進むので円弧を描きながら進むことになります。

リンクを切るときにはカーソルをリンクの上に持って行ってDelキーを押せばよいと書いてあるが、v2.5以降ではそれはできないようだ。一度Controllerを消してしまうとかで対応するしかないのだろうか?

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

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

Learning the basics of using the Blender Game Engine


に進みます。 ここではいよいよGame Engineの使い方が出てきます。基本は3Dパネル上でPキーを押すだけです。Pキーを押すとGameモードになって、Escを押すと元に戻るようです。

Game Engine(以降GE)のためにShading modeを変更します。Shading modeを2.4以前ではDraw Typeと呼んでいましたが、2.5以降ではViewport Shadingとなっています。下のようにして設定します。


ここでPキーを押すと下のようにライティングが考慮されて表示されます。


準備が出来たのでそろそろ物体を動かすためのしかけの設定に行きましょう。そのためにBlender2.5以降ではEditor TypeとしてLogic Editorを選びます。


するとLogic Editorが現れます。


表示が小さい時はパネル上にマウスカーソルを置いて、ホイールで調整します。


それでもやりにくければCtrl+↑でパネルを最大化して使えばいいでしょう。

GEでは上のようにSensor、Controller、Actuatorという3種のロジックブロックでオブジェクトの動きを指定出来るようになっています。

SensorはControllerに対してトリガを出すためのブロックで、常にトリガを出したり、何かキーが押された時にトリガを出したりというような設定ができます。

ControllerはSensorの入力をどう取り扱い、Actuatorへトリガを渡すかということを決定するためのブロックです。AndやOrなどのロジックやPythonでの記述が可能なようです。例えばAndを使って、2つのSensor入力を指定すると2つのSensor入力の両方からトリガが来ている時のみActuatorへのトリガを出します。

Actuatorはオブジェクトを動かしたり、アニメーションを表示したり、音を出したりします。 

各ロジックブロックから1つずつ適当なものを選びます。最初はSensor→Always、Controller→Add、Actuator→Motionとしましょう。

次にこれらのロジックブロックをつなぎます。

繋ぎ終わったら3DパネルでPキーを押してGEを走らせてみましょう。何も起こりませんね(^^; これはActuatorのMotionに何も設定しなかったので、Motionがないからです。オブジェクトの動かし方は


で。


2011年10月15日土曜日

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

ここのチュートリアルに従って勉強していきます。v2.4用なのでちょっとメニューが違ったりします。

The basics of the Blender UI, and how to quickly use it

で操作方法を確認。大体、2.5、2.6と同じですが、下のようにPerspective(透視図)にするメニューが少し変わっています。


また2.5からはSpaceキーでAddなどのメニューが出なくなったようです。

この節の終わりの方にある”Renaming objects” のところですが、2.5以降は変わっています。そもそも立ち上げ時の画面構成などが若干変わっており、説明にある




 ではなく、2.5以降では、



のような感じです。で Renaming Object はどうするかというと、下の図に示すように、



下側のタイムラインパネル(デフォルトではこのパネルが3Dパネルの下に出ている。しかし使い方によってはパネル構成など変わっていることもあるので、自分の好きなパネルを選べばよい)の左下にあるボタンをクリックすると下のようにメニューが出てくるので、ここからPropertiesを選びます。



こうするとPropertiesパネルが現れますが、少し小さいので下のようにして広げます。


あるいは下のパネル上にマウスカーソルを持ってきた状態で Ctrl+↑(上矢印)(Ctrl+↓やShift+Spaceバーでも同じ様です)を押すと全面がPropertiesパネルになるので、ここで編集してもいいです。終わったらまたCtrl+↑を押すと元の大きさに戻ります。

次に下のようにメニューからObjectを選んでクリックします。
下のような画面になるので適当な名前を入力してEnterを押すとRenameできます。


これで

The basics of the Blender UI, and how to quickly use it

のページをBlender2.5以降で出来るようになりました(^^V

Blender:Game Engine

ようやく時間が出来たのでBlenderを触って見ることに。まずはGame Engine(日本語はちょっと古いけどここ)でアニメーション?を動かしてみよう。2.60RC2が出ているのでdlする。

立ち上げたところ。2.60のはずだが2.59.4となっている。

2011年2月12日土曜日

Blender:2.56βの図形間の演算

図形を足しあわせたり、引いたりして図形の演算をすることが出来ます。これも2.56βでインタフェースが変わっているようなのでメモっておきます。

まず図のように立方体と球を重ねた状態に設定します。


次にPropertiesのWindow(図では右の方の黄色い四角で囲んだところです。設定によって場所などは変わります。)で、黄色い円で囲んだModifiersを選びます。また赤い円で囲んである部分にCube(立方体)が設定されていることを確認して下さい。これは先ほど選んだオブジェクトのうち、最後に選んだオブジェクトが表示されます。これから行なう図形演算はこのオブジェクトに対して実行されます。


そうしておいて、Add Modifiersと書いてあるボタンを押すと下のようなドロップダウンメニューが出てきますので、ここからBooleanを選びます。Booleanでは図形を足したり、引いたり、図形から共通部分を取り出したりする操作が出来ます。


差の演算を行いたいので、図の黄色の円で示してあるようにDifferenceを選びます。


そして、Cubeとの演算を行なう相手のオブジェクトを選びます。ここでは球体が相手なのでSphereを選びます。これを選んでいないとApplyボタンを押して演算を実行するときに"Modifier is disabled, skipping apply"というエラーが出て悩まされます(^^;


そしてApplyボタンを押して、左のWindowで、球体を移動させると球との交わりが取り除かれた立方体が残っています。

Blender:2.56βのWindowの分割

Windowの分割も少しずつ変わっているようで、2.56βでは次のようにします。

まずWindowの右上の斜線の入った小さい三角形 のところにマウスカーソルを持って行きます。するとマウスカーソルが+字に変わります(図の黄色い円で囲んだ部分)。


アップで示すと次のようになります。


このとき左マウスボタンをクリックしたまま左にドラッグすると下の図のように横に2つの画面に分割します。引っ張る量の違いで画面の分割の大きさは変わります。


左マウスボタンをクリックしたまま下にドラッグすると下の図のように縦に2つの画面に分割します。


さらに分割したWindowでも同様に左マウスボタンをクリックしたままドラッグすると下の図のように2つの画面に分割します。


次に戻す時ですが、今度は分割したWindowの右上の三角形を左クリックでドラッグしてくっつけたいWindow上に持って行きます。下の図では下の左のWindowを右のWindowとくっつけています。


上の矢印の元側のWindowで表示しているものがくっつけた後のWindowに表示されます。


最後に右のWindowを左にくっつける時ですが、普通にやってしまうとドラッグしたときに分割されてしまいます。ドラッグの軌跡が自分のWindow内を通ると分割されるようです。


ということで下の図のように自分のWindowを避けてドラッグすると右のWindowを左にくっつけることができます。上下の場合も同じようにします。