タイトル画像

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だから、いかにこのサイトが有名な老舗かが分かる。


【追記】
 ちなみに、中継用のカメラ(SecurityCam)から monitor を見ると、その画面(表面)は真っ黒に見えます。
monitor を見るためのカメラを用意したのはそのためなのですが、最初その仕様に気付かず何度も他を見直してやり直していたのはここだけの話(;-∀-)

 さて、今回は初めて python を使うので、放り込むだけで使えるお手軽なものを使いました。
後々ソースコードをじっくり眺めてみたのですが、1行1行丁寧に説明のコメントが付いているのにも係わらず、その内容はよく解りませんでした……(;-_-)

 以下に原文のコピーを置いておきます。


######################################################
#
# RenderToTexture.py Blender 2.50
#
# Tutorial for using RenderToTexture.py can be found at
#
# www.tutorialsforblender3d.com
#
# Released under the Creative Commons Attribution 3.0 Unported License.
#
# If you use this code, please include this information header.
#
######################################################

#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




【作業手順の説明コメント 日本語訳】
#ゲームロジックをインポート

#現在(カレント)のシーンを取得

#カレントコントローラーを取得

#オブジェクトスクリプトを取得することは……に所属(加入)することです(?)

#RenderToTexture が追加されているかを確認

#テクスチャをアップデート

#もし RenderToTexture が追加されていない場合

#ビデオテクスチャモジュールをインポート

#シーン内のオブジェクトのリストを取得

#取得したカメラの名前はレンダリングされた画像をテクスチャにするために使われている

#カメラオブジェクトを取得

#テクスチャマテリアルIDを取得

#テクスチャをセット

#テクスチャイメージを取得

#RenderToTexture をオブジェクト変数として保存


 なるほどさっぱりわからん(*・з・)
関連記事
スポンサーサイト

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


<<Blender の Python を解読してみる。 | ホームへ | blender で python を使……いたい!>>
コメント
ファイルをダウンロードさせてもらったのですが、recent placeというファイルしか入っていません。
これは何でしょうか、、、(´・ω・`)
【2014/11/11 10:42】 | 名無しさん@ニュース2ch #- | [edit]
>名無しさん@ニュース2chさん
> ファイルをダウンロードさせてもらったのですが、recent placeというファイルしか入っていません。
> これは何でしょうか、、、(´・ω・`)

返信が遅くなり申し訳ありません。
ブログごと放置していたので、コメントをいただいていることに気付いておりませんでした(汗)

recent place はウィンドウズのショートカットの一種です。
こちらでデータをダウンロードして解凍してみたところ、名無しさん@ニュース2chさんと同じ結果になりました。
恐らくデータを圧縮する際の設定が間違っていたのではないかと思います。

せっかくダウンロードしていただいたのに申し訳ありませんm(_ _;)m
今は修正したファイルをUPし直したので、もし宜しかったら再度ダウンロードしていただけると嬉しいです。
(今度は事前に自分でダウンロードして解凍するところまで確認しましたので大丈夫だと思います。)
【2015/01/16 21:12】 | フンストン #- | [edit]
コメントの投稿













管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://funstone.blog.fc2.com/tb.php/18-db3bf8f7
この記事にトラックバックする(FC2ブログユーザー)