Panda3D memo

Panda3D

Showbase

  • グラフィックディスプレイを開いたり,Pandas3Dでモデルを読み込んだり(loader),カメラやタスクマネージャー(taskMgr)を管理したりするトップオブジェクト。
  • ShowBase()すると,グローバルにbase, render, cameraとかのインスタンスが作られるマニュアル。よって,一度ShowBaseのインスタンスを作れば,Pythonインタプリタからは,これらの自動生成インスタンスにアクセスすることが出来るようになる。Built-in Global Variableと呼ぶようで,その一覧はここ。サンプルを見ても,これらのインスタンスが見えていることを前提にした書き方になっている。これはすごく嫌な仕様だな・・・。プロトタイプでは良いけれど,大きなプロジェクトではこの記述は避けるように,とマニュアルに書かれているが,別の正式な方法があるのかな??

Camera

  • ShowBaseのインスタンスを生成すると自動的にcameraインスタンスPythonのGlobal空間に生成される。
  • camera.setPos()しても,なぜか思い通りにカメラが動かなくて困ったが,これはデフォルトのマウスによるカメラ移動をOffにしていないから。TaskMgr経由でカメラを動かすと毎時動いているからか問題にならないみたいだけど,一回だけカメラを動かす,と言うときにはマウスのカメラ操作機能を切る(disableMouse())する必要がある。
  • カメラの初期位置を設定した後に,マウスのカメラ操作をOnにすることは出来ないようだ。Onにすると,デフォルトの位置に戻ってしまう。その場合は自分でマウスに依るカメラコントロールを書く必要がある,が,これは別に難しくはない。
  • カメラはbase.cameraの自動生成のものだけでなく,panda3d.core.cameraで追加することも出来る。
# ウィンドウを分割して2つのカメラの画像を表示する例
from direct.showbase.ShowBase import ShowBase
from direct.showbase.Loader import Loader
from panda3d.core import *

# Loading Model
base = ShowBase( )
model = loader.loadModel( "models/misc/rgbCube" )
model.reparentTo( render )
model.setPos( 0, 5, 0 )  #y: depth # z: upper


# Subcamera
displayRegion = base.win.makeDisplayRegion(0.2, 1, 0, 1)
displayRegion.setClearColor(VBase4(0, 0, 0, 1))
displayRegion.setClearColorActive(True)

cam2 = Camera( 'camera2' )
lens = PerspectiveLens( )
lens.setViewVector( 0, 5, 0, 0, 0, 1 )
cam2.setLens( lens )
camNP = NodePath(cam2)
camNP.setPos( 0, -16, 0 )
displayRegion.setCamera(camNP)
camNP.reparentTo(render)
#camNP.reparentTo(base.cam)とすると、メインのカメラの動きに連動する

# split dimension
dr = base.cam.node().getDisplayRegion(0)
dr2 = camNP.node().getDisplayRegion(0)

dr.setDimensions(0, 0.5, 0, 0.5)
dr2.setDimensions(0.5, 1, 0, 1)

base.run( )

Scene Graph

  • SceneGraphはレンダリング対象を保持するデータ構造。ルートに"render"オブジェクトがあって,その下に階層的にオブジェクトが保持されている形式。
  • モデルを読み込んだら,renderなりの子供に指定する(reparentTo)ことでSceneGraphに登録する。そうすると,レンダリング対象となる。

Task

  • 毎フレーム呼び出される手続き。
  • task.timeはtimestep (elasped time)
  • taskMgrは,タスクがAsyncTask.DS_cont(定数)を返す限り,毎フレーム呼び出される。

Actor

  • アニメーションするモデルの管理。
  • モデルを読み込む際に,静的なオブジェクトはloadModel()を用いて読み込み,動的なオブジェクトはActorを用いる。
  • Actorにはモデルのファイル名と,そのモデルの動かし方,の2つを指定して読み込む。

Interval and Sequence (Meta-interval)

  • intervalはある期間に渡ってプロパティを変更するタスク。intervalを有効に開始すると,プロパティをバックグラウンドプロセスで開始できる。
  • sequenceはmeta-intervalとも呼ばれるもので,intervalのコンテナ。

マウス

  • デフォルトで左ボタンで左右,右ボタンで前後,同時押しで視点ベースで回転,真ん中ボタンで世界座標系の中心で回転,する。
  • 不要な場合は下記でカメラのマウス操作をオフに出来る。
ShowBase.disableMouse()

メモ

  • Screenshotを取ることで画面を保存できる。デフォルトはjpgだけど,pngを指定することも出来る。pngだと透明チャンネルも出力される。不要ならば,OpenCVなどの画像処理で透明チャンネルを削除すればjpegと同じ見た目の画像になる。