タイトル画像

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.変数がデータを得ること
【追記】
日本語で説明してくれてるところあったわ(*・ω・)
VideoTexture モジュール

でも難しくて細かい所はまだ解らず終い(;-ω-)

【リベンジだッ!】
【和訳・解説】

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

#現在(カレント)のシーンを取得
scene = GameLogic.getCurrentScene()
→scene という変数に GameLogic の(中にある)getCurrentScene() という関数(※1 ※2)を呼び出して代入している。変数を定義しているとも言う。

※1 “関数”は英語 function の直訳で、日本語での近い意味は“機能”。
※2 関数名の右に付いてる括弧は引数(ひきすう)を入れる括弧。
   この場合引数が無い状態で呼び出しているので括弧の中が空になっている。

#カレントコントローラーを取得
controller = GameLogic.getCurrentController()
→上と同じ要領で、controller という変数に、GameLogic の getCurrentController() を定義している。

#オブジェクトスクリプトを取得すること、(それは)こうやって入れ子構造にすることです。
obj = controller.owner
→obj を controller の owner と定義。

#RenderToTexture が追加されているかを確認
if "RenderToTexture" in obj:
→if~in の読み方はこちらで調べながら読みました。

でもこれは普通に英文として訳すほうが分かりやすいような……。
「もし、"RenderToTexture"が obj に含まれるなら」(結果が“真”なら)
以下のように処理せよ。


    #テクスチャをアップデート
    obj["RenderToTexture"].refresh(True)
    →RenderToTexture という名前の obj (というオブジェクト)の中の
    refresh(True) を呼び出せ。

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

    #ビデオテクスチャモジュールをインポート
    import VideoTexture
    →「ビデオテクスチャ」をインポート
    
    #シーン内のオブジェクトのリストを取得
    objList = scene.objects
    →?
    objList(という配列) にscene 内の objects (全てのオブジェクトのデータ)
    を入れている。
    事前に objList を定義していないのにそんなことが出来ると? 面妖な……。
    
    #取得したカメラの名前はレンダリングされた画像をテクスチャにするために使われている
    camName = obj['cam']
    →変数 camName に cam と言う名前のオブジェクトを定義する。
    
    #カメラオブジェクトを取得
    cam = objList[camName]
    →変数 cam に、中に camName が入っている objList を定義する。
    
    #テクスチャマテリアルIDを取得
    matID = VideoTexture.materialID(obj, "MA" + obj['material'])
    →マテリアルID に
    VideoTexture の中の関数 materialID (obj と "MA" + material と言う名前の obj)を定義する。
    
    やっぱりここらへんちょっと仕組みがよく解んないです(汗)
    "MA" と + 演算子が謎(;-ω-)
    
    #テクスチャをセット
    renderToTexture = VideoTexture.Texture(obj, matID)
    →renderToTexture に
    VideoTexture の中の、
    引数 obj と matID を持った関数 Texture をセット(定義)する。
    
    #テクスチャイメージを取得
    renderToTexture.source = VideoTexture.ImageRender(scene,cam)
    →renderToTexture の source に
    VideoTexture の関数、 ImageRender(scene,cam) を入れる。
    
    #RenderToTexture をオブジェクト変数として保存
    obj["RenderToTexture"] = renderToTexture
    →RenderToTexture と言う名前のオブジェクト(変数)に
    renderToTexture を持って来て入れる。
    
 うむ、あれだ。
入れ子構造にし過ぎててわけわからん……(;-д-)
関連記事
スポンサーサイト

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


<<プログラミングを学ぶ | ホームへ | real time video texture / リアルタイムビデオテクスチャ【python】>>
コメント
コメントの投稿













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

トラックバック

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