Panda3d の様々な機能(テクスチャマッピング,光源,動き)
Panda3D は,オープンソースのソフトウェア,3次元ゲーム,可視化,シミュレーションの機能を持つ.
【サイト内の関連ページ】
- Windows での Panda3D のインストール: 別ページ »で説明
- Ubuntu での Panda3D のインストール: 別ページ »で説明
- Panda3D の機能概要(説明資料)[PDF], [パワーポイント]
- 3次元のゲームエンジン Panda3D を使ってみる: 別ページ »にまとめている.
先人に感謝.
【関連する外部ページ】http://www.panda3d.org/download.php?sdk&version=devel
テクスチャマッピング
egg 形式ファイルの3次元モデルである c:\Program Files\Python38\lib\site-packages\panda3d\models\misc\rgbCube.egg も読み込む
- プログラムでは「scene」,「ball」という名前のオブジェクトを作成
- テキストファイルの中身を次のように書き替える
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader from panda3d.core import Quat from panda3d.core import TextureStage, TexGenAttrib class HelloWorld(ShowBase): def __init__(self): ShowBase.__init__(self) self.scene = self.loader.loadModel("models/environment") self.scene.reparentTo(self.render) self.scene.setScale(1, 1, 1) self.scene.setPos(0, 0, 0) self.cube = self.loader.loadModel("models/misc/rgbCube") self.texture1 = self.loader.loadTexture( "models/maps/envir-rock1.jpg" ) self.cube.setTexGen( TextureStage.getDefault( ), TexGenAttrib.MWorldPosition ) self.cube.setTexture( self.texture1 ) self.cube.reparentTo(self.render) self.cube.setScale(1, 1, 1) self.cube.setPos(0, 20, 0) self.cube.setQuat( Quat( 0, 1, 1, 1 ) ) app = HelloWorld() app.run()
- テキストファイルを,保存する.
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
- Python プログラムの実行
cd <先ほど保存したディレクトリ> python hoge.py
- 3次元モデルにテクスチャがマッピングされるので確認する.
- マウス操作
- 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
- 右ボタンを押しながらマウスを動かす: 視点移動(前後)
結果を確認したら,右上の「x」をクリックして終了.
平行光源
平行光源
- self.light1.setColor( VBase4( 0.9, 0.9, 1.0, 1 ) ): 平行光源の色
- self.light1.setDirection( Vec3( 1, 0, 0 ) ): 平行光源の向き
- テキストファイルの中身を次のように書き替える
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader from panda3d.core import Quat from panda3d.core import VBase4, Vec3 from panda3d.core import DirectionalLight, AmbientLight class HelloWorld(ShowBase): def __init__(self): ShowBase.__init__(self) self.scene = self.loader.loadModel("models/environment") self.scene.reparentTo(self.render) self.scene.setScale(1, 1, 1) self.scene.setPos(0, 0, 0) self.cube = self.loader.loadModel("models/misc/rgbCube") self.cube.reparentTo(self.render) self.cube.setScale(1, 1, 1) self.cube.setPos(0, 20, 0) self.cube.setQuat( Quat( 0, 1, 1, 1 ) ) self.light1 = DirectionalLight( 'light1' ) self.light1.setColor( VBase4( 0.9, 0.9, 1.0, 1 ) ) self.light1.setDirection( Vec3( 1, 0, 0 ) ) render.setLight( render.attachNewNode( self.light1 ) ) app = HelloWorld() app.run()
- テキストファイルを,保存する.
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
- Python プログラムの実行
cd <先ほど保存したディレクトリ> python hoge.py
- 平行光源の効果(全体が少し暗くなる。およそ右側の面だけが明るい)を確認する
- マウス操作
- 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
- 右ボタンを押しながらマウスを動かす: 視点移動(前後)
結果を確認したら,右上の「x」をクリックして終了.
カメラを自動で動かす
- self.taskMgr.add() : フレームごとに呼び出すメソッドの指定
- 今度はカメラ (camera) を動かす
- テキストファイルの中身を次のように書き替える
from math import pi, sin, cos from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader from panda3d.core import Quat from direct.task import Task class HelloWorld(ShowBase): def __init__(self): ShowBase.__init__(self) self.scene = self.loader.loadModel("models/environment") self.scene.reparentTo(self.render) self.scene.setScale(1, 1, 1) self.scene.setPos(0, 0, 0) self.taskMgr.add(self.spinCameraTask, "SpinCameraTask") def spinCameraTask(self, task): angleDegrees = task.time * 10.0 angleRadians = angleDegrees * (pi / 180.0) self.camera.setPos(20 * sin(angleRadians), -20.0 * cos(angleRadians), 3) self.camera.setHpr(angleDegrees, 0, 0) return Task.cont app = HelloWorld() app.run()
- テキストファイルを,保存する.
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
- Python プログラムの実行
cd <先ほど保存したディレクトリ> python hoge.py
- カメラが自動で移動するので確認する.
結果を確認したら,右上の「x」をクリックして終了.
オブジェクトに動きのデータを割り当てる(アクター)
- テキストファイルの中身を次のように書き替える
from math import pi, sin, cos from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader from panda3d.core import Quat from direct.task import Task from direct.actor.Actor import Actor class HelloWorld(ShowBase): def __init__(self): ShowBase.__init__(self) self.scene = self.loader.loadModel("models/environment") self.scene.reparentTo(self.render) self.scene.setScale(1, 1, 1) self.scene.setPos(0, 0, 0) self.pandaActor = Actor("models/panda-model", {"walk": "models/panda-walk4"}) self.pandaActor.setScale(0.005, 0.005, 0.005) self.pandaActor.reparentTo(self.render) self.pandaActor.loop("walk") app = HelloWorld() app.run()
- テキストファイルを,保存する.
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
- 画面が出るので確認する
- マウス操作
- 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
- 右ボタンを押しながらマウスを動かす: 視点移動(前後)