タイトル画像

Blender の Python を解読してみる。

2014.09.13(11:58) 19

 少しは python が読めるようになったで、前回のビデオテクスチャpython コードを読んでみました(未遂)←



【原文】
※ヘッダ省略

#import GameLogic
import GameLogic

# get current scene
scene = GameLogic.getCurrentScene()

# get the current controller
controller = GameLogic.getCurrentController()

# get object script is attached to
obj = controller.owner

# check to see RenderToTexture has been added
if "RenderToTexture" in obj:

    # update the texture
    obj["RenderToTexture"].refresh(True)

# if RenderToTexture hasn't been added
else:

    # import VideoTexture module
    import VideoTexture

    # get a list of objects in the scene
    objList = scene.objects

    # get camera name being used for render to texture
    camName = obj['cam']

    # get camera object
    cam = objList[camName]

    # get the texture material ID
    matID = VideoTexture.materialID(obj, "MA" + obj['material'])

    # set the texture
    renderToTexture = VideoTexture.Texture(obj, matID)

    # get the texture image
    renderToTexture.source = VideoTexture.ImageRender(scene,cam)

    # save RenderToTexture as an object variable
    obj["RenderToTexture"] = renderToTexture
【和訳・解説】

#ゲームロジックをインポート
import GameLogic
→ゲームロジックをインポート

#現在(カレント)のシーンを取得
scene = GameLogic.getCurrentScene()
→『「Gamelogic」の中の「getCurrentScene()」』を「scene」という変数に代入している。
 「.」は「\」みたいなもので、その中にあるものが次に来る。

 これをやっておく利点は、一度こうやって変数に入れておけば、次からは「GameLogic.getCurrentScene()」と打たなくても「scene」とさえ打てば同じ意味になるので、ソースコードがスッキリまとまって見やすくなるということだ。

#カレントコントローラーを取得
controller = GameLogic.getCurrentController()
→変数「controller」に「GameLogic.CurrentController」を代入する。
 これをやる理由は上と同じ。

#オブジェクトスクリプトを取得すること、(それは)こうやって入れ子構造にすることです。
(that 構文の that を省略した形だよね? 和訳合ってるか不安;)
obj = controller.owner
→「obj」に「cotroller.owner」を代入。
 すでに「GameLogic.CurrentController」が「controller」に代入されているので、変数に変数が代入されていることになるんですね。

#RenderToTexture が追加されているかを確認
if "RenderToTexture" in obj:
→if 文ですね。条件分岐です。
 文の最後に「:」を付けて改行し、次の行でインデント(Tab キー)を入れて、条件が成立した場合の処理を書きます。
 この場合は「もし、 obj に "RenderToTexute" が入っていたら」という条件でしょうか。

 つまり「もしゲームロジックのコントローラーに RenderToTexuture が入っていたら、
下に示すトラップカードを発動!」みたいなニュアンスか←

    #テクスチャをアップデート
    obj["RenderToTexture"].refresh(True)
    →「"RenderToTexture"という名前の obj 」の中の refresh を True にせよ。

    ※この refresh はテクスチャの描画をコントロールする何かではないかと思う。
     曖昧でさらに確証が持てなくて申し訳ないです(・ω・;)

#もし RenderToTexture が追加されていない場合
else:
→その他:(上のコメント通りの意味)

    #ビデオテクスチャモジュールをインポート
    import VideoTexture
    →「ビデオテクスチャ」をインポート
    
    #シーン内のオブジェクトのリストを取得
    objList = scene.objects
    →「objList」に「scene の中の objects」を代入する。
    
    #取得したカメラの名前はレンダリングされた画像をテクスチャにするために使われている
    camName = obj['cam']
    →「camName」に 「cam」という名前の obj を代入。
    
    #カメラオブジェクトを取得
    cam = objList[camName]
    →「cam」に objList 内の[camName]を持って来て代入。
    
    #テクスチャマテリアルIDを取得
    matID = VideoTexture.materialID(obj, "MA" + obj['material'])
    →ここの処理は何をしているんだ??
    "MA"が何なのか分からない(マテリアルの"マ"なのは分かるけど……)
    
    #テクスチャをセット
    renderToTexture = VideoTexture.Texture(obj, matID)
    →???
    ここでの「renderToTexture」の最初の r が小文字なのはわざと?
    
    #テクスチャイメージを取得
    renderToTexture.source = VideoTexture.ImageRender(scene,cam)
    →????
    
    #RenderToTexture をオブジェクト変数として保存
    obj["RenderToTexture"] = renderToTexture
    →?????
    
 最後の方全然わからなかった(;-_-)
理解次第記事の修正をしようと思います。

 とりあえず解ったことは、「○○取得」というのは代入操作のことなんですね。
代入することで何かを呼び出したり書き換えたりしてるっぽい。

[追記]
 “取得”という言葉の使われ方がやっとわかりました(汗)

 “取得”の意味は……
1.(スクリプト実行の結果)計算結果などの値を得ること
2.変数がデータを得ること
⇒Blender の Python を解読してみる。の続きを読む
関連記事
スポンサーサイト

超エキサイティン! フンストンの3DCG至難の書


タイトル画像

real time video texture / リアルタイムビデオテクスチャ【python】

2014.09.09(23:52) 18

 blender game engine (以下BGE)でリアルタイムに更新されるテクスチャ(ビデオテクスチャ)を貼る方法を見つけたのでメモしておこうと思います。

【ビデオテクスチャとは】
 [ビデオテクスチャ]とは動くテクスチャのことです。
他のソフトでは[アニメーションテクスチャ]とも呼ばれることがあるあれです。
blender ではビデオテクスチャと呼びます。

 さらにリアルタイムということは、録画したものではなく中継放送と同じように、今この瞬間カメラに撮った映像をテクスチャに変換出来るということです。

 具体的には python (拾いもの)を使って camera view をメッシュ上に投影します。
今から手順を踏んで説明するので、焦らず落ち着いて慎重にやれば必ず上手くいくはずです。
一緒に python マスター目指しましょう!(*・ω・)ノ


1.撮影の準備をする。
 1.とりあえず被写体はスザンヌ、モニター用の板ポリ、それとカメラ2台を用意しましょう。
 videotex01
 照明も適当に暗くならない程度に置きます。
 ※まだ板ポリは寝かせたままにしておいてください。

 2.オブジェクトに名前を付けておきましょう。
   Plane→monitor
   Camera→SecurityCam

2.スザンヌを動かせるようにする。
 ゲームエンジンでスザンヌを動かせるようにします。
 videotex02
 1.レンダーエンジンを[Blender Game]に切り替え、画面構成も[Game Logic]に切り替えます。

 2.スザンヌを選択し、[Logic Editor]にてセンサー・コントローラー・アクチュエイターの3つを設定します。
   1.まずセンサーを追加します。
   [ Keyboard]を選択し、Key:の項目をクリック、割り当てたいキーを押すように指示が出るのでキーボードの[←]を押します。
   2.次にアクチュエイターを追加します。
     [Motion]を選択し、Loc:の項目でXの値を -0.10 にします。
   3.センサーとアクチュエイターの間をワイヤーでつなぎます。
     (・か◎にカーソルを乗せてドラッグするとワイヤーが出てきます。)
     すると自動的に AND コントローラーが間に挟まります。これは何も変更しないままでいいです。
     これで左(X軸のマイナスの値の方向)にスザンヌを動かせるようになりました。
   4.右方向も同じようにして設定します。(こちらは値を + にすること)

 3.Pキーを押してゲームを開始し、←→キーで動作を確認します。
   (ゲームの終了は[Esc]キー)

3.板ポリ(monitor)を受像できるように設定する。
  1.monitor を選択し、新規マテリアルを追加し[Screen]と名付けます。
   Screen の Shading パネルで[Shadeless]にチェックを入れます。

  2.次は新規テクスチャを追加し、これも[Screen]と名付けます。
    テクスチャタイプは[Image or Movie]。
    テクスチャに使う画像は各個人で適当なものを用意してください(何でも良い)。
    (筆者は白と黒の市松模様の画像にしました)
    checker
    ※念のため、画像は別のドライブやフォルダから持ってこない方が良いと思います。

  3.Mapping パネルの Coordinates: を[UV]にします。
    次から 3Dview に移り、テンキーの7を押して上面からの視点で操作します。
   (パース切ってね|ω・))

  4.今から受像画像用のUVを展開します。
   1.monitor を選択し、[Edit Mode]に切り替えます。
   2.頂点を全選択しUキーを押すとメニューが出てくるので、そこで[Project From View]を選択します。
   3.UV/Image Editor で monitor に対して等倍の大きさになるように割り当ててください。
     (見えないテクスチャを貼るような感覚です)
     videotex03

4. monitor に python を投入し、受像する。
 画面構成を[Game Logic]にし、[Logic Editor]を使う準備をしてください。

 1.センサーに[Always]を追加し、TURE スイッチを ON にします。

 2.コントローラーには[Python]を追加し、[Execution Method]の項目で[Script]を選びます。

 3.画面右上にある[Text Editor]の[+ New]をクリックして新しく原稿を用意し、そこにこのスクリプトを全文コピーしたものを放り込みます。
   マテリアルやテクスチャと同様に名前を付けます。
   名前は[RenderToTexture.py]としてください。拡張子を忘れずに。

 4.[Logic Editor]のコントローラーで今作った[RenderToTexture.py]が選べるようになっているので、選んで適用してください。

 5.次は monitor のプロパティを作ります。
   1.[+ Add Game Property]をクリックし、新たに2つプロパティを作ります。
    2つとも Type 欄で[String]を選択します。
   2.1つめのプロパティは[material]と入力し、2つめは[cam]と入力しましょう。
    これはスクリプトのコードにある記述と同じである必要があるため、変えてはいけないそうです。
   3.続いてプロパティの値を入力します。
    1つめのプロパティの値は[Screen]、2つめのプロパティの値は[SecurityCam]と入力します。
    値にはオブジェクトに付けた名前を入れるんですね(*・ω・)

 videotex04
 ↑画像を見て入力やチェックに漏れが無いことを確認してください。
 GLSL表示でしかこの python は動きませんので、Nキーで出てくるメニューの Display パネル Shading 項目は要チェックです。

 さて、これで仕掛けは出来ているはずです。
最後にPキーを押して確認してみましょう(・ω・)

 videotex05

 画像のように映るはずです。
←→キーを押してスザンヌを動かしてみましょう。入れ子になった画面の中のスザンヌも連動するはずです。

 ところで、背景が青くなるのは仕様だそうです。
参考にした動画のコメントによると、World の設定で何とか出来ると書いてありましたが何とも出来ませんでした。
今後の課題ですね(;-∀-)


 最後に、作った物をアップロードしておきましたので、参考までにどうぞ(*・ω・)つ

【参考動画】
Blender Video Texture Tutorial
 英語だけど文字だけでは伝わりにくい所が分かります。
このブログの記事と合わせて見ることをオススメします。
【参考動画の元ネタ】
Render to Texture -- Blender 3D Game Engine
 blender のバージョンが古いので、細かい所に違いがありますが、仕組みとしては同じです。

 というか、どう検索しても最終的に行き着くところはtutorials for blender 3dだから、いかにこのサイトが有名な老舗かが分かる。


⇒real time video texture / リアルタイムビデオテクスチャ【python】の続きを読む
関連記事

超エキサイティン! フンストンの3DCG至難の書


タイトル画像

blender で python を使……いたい!

2014.09.07(23:39) 17

【※下の方に有益な情報あり!】

 やはり苦手なものからいつまでも逃げていても仕方がないということで、ちゃんと python を勉強しようと思った。
のは結構前だったりする(;-∀-)

 python の使い方を勉強しようと思っていろいろ検索したり書店を見て回ってみても、blender に特化した物が無く、まずは簡単なアプリでも作って、慣れたら2Dゲームに進み、3Dはやりたい人だけその後勝手に挑戦してね、というものがほとんど……。
 ええ、おっしゃる通りでございます(;-з-)
 確かにC言語も勉強してないド素人には、スクリプトと言えど基礎からやらねば身に付かぬものばかりでしょう。

 しかし blender game engine の謳い文句は
「プログラミングの知識なしにゲームが作れる!」
なので、ここで"Hello world."からやってたら本末転倒な気がしないでもない……。
 そもそも blender 以外で使う予定が無いのだから。

 とかうだうだ思っていたら見つけてしまいました。神様仏様を←

 日本語で、しかも親切丁寧なチュートリアル式!
 MMD界隈でも名の知れた mato.sus304 さんのブログで講座をやっていました。
今までずっと英語で検索して海外のサイト漁ってました(-∀-;)
灯台下暗しですね。本当にありがたい事ですm(_ _)m

http://matosus304.blog106.fc2.com/blog-entry-220.html

 かなり基本からだけど、確実に使えることから教えてくれているので、穴が開くほどガッツリ読んで、しっかり覚えたいと思います(*・ω・)感謝


⇒blender で python を使……いたい!の続きを読む
関連記事

超エキサイティン! フンストンの3DCG至難の書


2014年09月
  1. Blender の Python を解読してみる。(09/13)
  2. real time video texture / リアルタイムビデオテクスチャ【python】(09/09)
  3. blender で python を使……いたい!(09/07)