Panda3D は,オープンソースのソフトウェア,3次元ゲーム,可視化,シミュレーションの機能を持つ.
【目次】
サイト内の関連資料:
先人に感謝.
Windows での Python 3.10,関連パッケージ,Python 開発環境のインストール: 別ページ »で説明
【サイト内の関連ページ】
Python のまとめ: 別ページ »にまとめ
【関連する外部ページ】
Python の公式ページ: https://www.python.org/
※ 参考のため,Visual Studio Code で Panda3d を使う手順を別のページで説明している.
from direct.showbase.ShowBase import ShowBase class HelloWorld(ShowBase): def __init__(self): ShowBase.__init__(self) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で画面を開きなさい
プログラムでは「scene」という名前のオブジェクトを作成
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader 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) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で3次元モデルを表示しなさい.マウス操作も行いなさい.
egg 形式ファイルの3次元モデルである次の2つのファイルを読み込み
これらは 3次元モデルのファイル
2つの3次元モデルのファイルを読み込むようにする
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader 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) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
立方体は、画面中央に緑色で現れる
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で3次元モデルを表示しなさい.マウス操作も行いなさい.
演習問題:次のように書き換えて、実行結果を確認する。今度は、真っ白の球が表示される
self.cube = self.loader.loadModel("models/misc/sphere") self.cube.reparentTo(self.render) self.cube.setScale(1, 1, 1) self.cube.setPos(0, 20, 0)
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader 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.cube1 = self.loader.loadModel("models/misc/rgbCube") self.cube1.reparentTo(self.render) self.cube1.setScale(1, 1, 1) self.cube1.setPos(0, 20, 0) self.cube2 = self.loader.loadModel("models/misc/rgbCube") self.cube2.reparentTo(self.render) self.cube2.setScale(1, 1, 1) self.cube2.setPos(5, 20, 0) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で2つの立方体を表示しなさい.マウス操作も行いなさい.
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader 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.cube1 = self.loader.loadModel("models/misc/rgbCube") self.cube1.reparentTo(self.render) self.cube1.setScale(1, 1, 1) self.cube1.setPos(0, 20, 0) self.cube2 = self.loader.loadModel("models/misc/rgbCube") self.cube2.reparentTo(self.render) self.cube2.setScale(1, 1, 1) self.cube2.setPos(5, 20, 0) self.cube2.setScale(2.4) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で2つの立方体を表示しなさい.マウス操作も行いなさい.
演習問題の2:倍率の違う 5つの立方体を表示する次のプログラムを実行し、結果を確認する
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader 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.cube1 = self.loader.loadModel("models/misc/rgbCube") self.cube1.reparentTo(self.render) self.cube1.setScale(1, 1, 1) self.cube1.setPos(-6, 20, 0) self.cube1.setScale(0.2) self.cube1 = self.loader.loadModel("models/misc/rgbCube") self.cube1.reparentTo(self.render) self.cube1.setScale(1, 1, 1) self.cube1.setPos(-3, 20, 0) self.cube1.setScale(0.6) self.cube1 = self.loader.loadModel("models/misc/rgbCube") self.cube1.reparentTo(self.render) self.cube1.setScale(1, 1, 1) self.cube1.setPos(0, 20, 0) self.cube1.setScale(1.0) self.cube1 = self.loader.loadModel("models/misc/rgbCube") self.cube1.reparentTo(self.render) self.cube1.setScale(1, 1, 1) self.cube1.setPos(3, 20, 0) self.cube1.setScale(1.4) self.cube1 = self.loader.loadModel("models/misc/rgbCube") self.cube1.reparentTo(self.render) self.cube1.setScale(1, 1, 1) self.cube1.setPos(6, 20, 0) self.cube1.setScale(1.8) app = HelloWorld() app.run()
egg 形式ファイルの3次元モデルである c:\Program Files\Python38\lib\site-packages\panda3d\models\misc\rgbCube.egg も読み込む
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader from panda3d.core import Quat 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.cube1 = self.loader.loadModel("models/misc/rgbCube") self.cube1.reparentTo(self.render) self.cube1.setScale(1, 1, 1) self.cube1.setPos(0, 20, 0) self.cube2 = self.loader.loadModel("models/misc/rgbCube") self.cube2.reparentTo(self.render) self.cube2.setScale(1, 1, 1) self.cube2.setPos(5, 20, 0) self.cube2.setQuat( Quat( 0, 1, 1, 1 ) ) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で2つの立方体を表示しなさい.マウス操作も行いなさい.
演習問題の2:setQuat に設定した値の違う 5つの立方体を表示する次のプログラムを実行し、結果を確認する
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader from panda3d.core import Quat 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.cube1 = self.loader.loadModel("models/misc/rgbCube") self.cube1.reparentTo(self.render) self.cube1.setScale(1, 1, 1) self.cube1.setPos(-6, 20, 0) self.cube1.setQuat( Quat( 0, 1, 1, 0 ) ) self.cube2 = self.loader.loadModel("models/misc/rgbCube") self.cube2.reparentTo(self.render) self.cube2.setScale(1, 1, 1) self.cube2.setPos(-3, 20, 0) self.cube2.setQuat( Quat( 0, 1, 1, 0.2 ) ) self.cube3 = self.loader.loadModel("models/misc/rgbCube") self.cube3.reparentTo(self.render) self.cube3.setScale(1, 1, 1) self.cube3.setPos(0, 20, 0) self.cube3.setQuat( Quat( 0, 1, 1, 0.4 ) ) self.cube4 = self.loader.loadModel("models/misc/rgbCube") self.cube4.reparentTo(self.render) self.cube4.setScale(1, 1, 1) self.cube4.setPos(3, 20, 0) self.cube4.setQuat( Quat( 0, 1, 1, 0.6 ) ) self.cube5 = self.loader.loadModel("models/misc/rgbCube") self.cube5.reparentTo(self.render) self.cube5.setScale(1, 1, 1) self.cube5.setPos(6, 20, 0) self.cube5.setQuat( Quat( 0, 1, 1, 0.8 ) ) app = HelloWorld() app.run()
キーコードの種類 "A", "space", "enter", "arrow_left", "arrow_up", "arrow_down", "arrow_right" など
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader from panda3d.core import Quat 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.accept( "a", self.a_key ) def a_key(self): self.cube.setScale(2) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で立方体を表示しなさい.キーボードの「A」キーを押す操作も行いなさい.
演習問題の2: スペースキーに反応するように、プログラムを次のように書き換えて実行しなさい
self.accept( "space", self.space_key ) def space_key(self): self.cube.setScale(5)
マウスボタンのコード "mouse1", "mouse2", "mouse3"
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader from panda3d.core import Quat 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.accept( "mouse1", self.mouse1 ) self.accept( "mouse3", self.mouse3 ) def mouse1(self): self.cube.setScale(2) def mouse3(self): self.cube.setScale(0.5) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で立方体を表示しなさい.右と左のマウスボタンを押す操作も行いなさい.
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader from panda3d.core import Quat 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.accept( "arrow_up", self.up_key ) self.accept( "arrow_down", self.down_key ) self.accept( "arrow_right", self.right_key ) self.accept( "arrow_left", self.left_key ) def up_key(self): self.cube.setZ( self.cube.getZ() + 1 ) def down_key(self): self.cube.setZ( self.cube.getZ() - 1 ) def right_key(self): self.cube.setX( self.cube.getX() + 1 ) def left_key(self): self.cube.setX( self.cube.getX() - 1 ) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で立方体を表示しなさい. キーボードの矢印キー(上、下、右、左)でオブジェクトが移動するので確認する
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.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.taskMgr.add(self.cubeMotionTask, "CubeMotionTask") def cubeMotionTask(self, task): self.cube.setPos(0, 20, task.time * 0.2) return Task.cont app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で立方体を表示しなさい. 動くことを確認する
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.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.previous_time = 0 self.x = 0 self.y = 20 self.z = 0 self.vx = 0 self.vy = 0 self.vz = 0 self.accept( "arrow_up", self.up_key ) self.accept( "arrow_down", self.down_key ) self.accept( "arrow_right", self.right_key ) self.accept( "arrow_left", self.left_key ) self.taskMgr.add(self.cubeMotionTask, "CubeMotionTask") def cubeMotionTask(self, task): self.x += self.vx * (task.time - self.previous_time) self.y += self.vy * (task.time - self.previous_time) self.z += self.vz * (task.time - self.previous_time) self.cube.setPos(self.x, self.y, self.z) self.previous_time = task.time return Task.cont def up_key(self): self.vz = self.vz + 1 def down_key(self): self.vz = self.vz - 1 def right_key(self): self.vx = self.vx + 1 def left_key(self): self.vx = self.vx - 1 app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py
結果を確認したら,右上の「x」をクリックして終了.
演習問題:上の手順で立方体を表示しなさい. キーボードの矢印キー(上、下、右、左)でオブジェクトが移動するので確認する
from direct.showbase.ShowBase import ShowBase from direct.showbase.Loader import Loader from panda3d.core import Quat from pandac.PandaModules import CollisionTraverser, CollisionHandlerPusher from pandac.PandaModules import CollisionNode, CollisionSphere class HelloWorld(ShowBase): def __init__(self): ShowBase.__init__(self) base.cTrav = CollisionTraverser() self.pusher = CollisionHandlerPusher() self.scene = self.loader.loadModel("models/environment") self.scene.reparentTo(self.render) self.scene.setScale(1, 1, 1) self.scene.setPos(0, 0, -5) self.cube1 = self.loader.loadModel("models/misc/rgbCube") self.cube1.reparentTo(self.render) self.cube1.setScale(1, 1, 1) self.cube1.setPos(-6, 20, 0) self.cube1.setQuat( Quat( 0, 1, 1, 0 ) ) c = CollisionNode('Cube1') c.addSolid(CollisionSphere(0, 0, 0, 0.6)) cube1_c = self.cube1.attachNewNode(c) self.cube2 = self.loader.loadModel("models/misc/rgbCube") self.cube2.reparentTo(self.render) self.cube2.setScale(1, 1, 1) self.cube2.setPos(-3, 20, 0) self.cube2.setQuat( Quat( 0, 1, 1, 0.2 ) ) c = CollisionNode('Cube2') c.addSolid(CollisionSphere(0, 0, 0, 0.6)) cube2_c = self.cube2.attachNewNode(c) self.cube3 = self.loader.loadModel("models/misc/rgbCube") self.cube3.reparentTo(self.render) self.cube3.setScale(1, 1, 1) self.cube3.setPos(0, 20, 0) self.cube3.setQuat( Quat( 0, 1, 1, 0.4 ) ) c = CollisionNode('Cube3') c.addSolid(CollisionSphere(0, 0, 0, 0.6)) cube3_c = self.cube3.attachNewNode(c) self.cube4 = self.loader.loadModel("models/misc/rgbCube") self.cube4.reparentTo(self.render) self.cube4.setScale(1, 1, 1) self.cube4.setPos(3, 20, 0) self.cube4.setQuat( Quat( 0, 1, 1, 0.6 ) ) c = CollisionNode('Cube4') c.addSolid(CollisionSphere(0, 0, 0, 0.6)) cube4_c = self.cube4.attachNewNode(c) self.cube5 = self.loader.loadModel("models/misc/rgbCube") self.cube5.reparentTo(self.render) self.cube5.setScale(1, 1, 1) self.cube5.setPos(6, 20, 0) self.cube5.setQuat( Quat( 0, 1, 1, 0.8 ) ) c = CollisionNode('Cube5') c.addSolid(CollisionSphere(0, 0, 0, 0.6)) cube5_c = self.cube5.attachNewNode(c) self.player = self.loader.loadModel("models/misc/rgbCube") self.player.reparentTo(self.render) self.player.setScale(1, 1, 1) self.player.setPos(0, 15, 0) c = CollisionNode('Player') c.addSolid(CollisionSphere(0, 0, 0, 0.6)) player_c = self.player.attachNewNode(c) self.accept( "arrow_up", self.up_key ) self.accept( "arrow_down", self.down_key ) self.accept( "arrow_right", self.right_key ) self.accept( "arrow_left", self.left_key ) base.cTrav.addCollider(cube1_c, self.pusher) base.cTrav.addCollider(cube2_c, self.pusher) base.cTrav.addCollider(cube3_c, self.pusher) base.cTrav.addCollider(cube4_c, self.pusher) base.cTrav.addCollider(cube5_c, self.pusher) base.cTrav.addCollider(player_c, self.pusher) self.pusher.addCollider(cube1_c, self.cube1, base.drive.node()) self.pusher.addCollider(cube2_c, self.cube2, base.drive.node()) self.pusher.addCollider(cube3_c, self.cube3, base.drive.node()) self.pusher.addCollider(cube4_c, self.cube4, base.drive.node()) self.pusher.addCollider(cube5_c, self.cube5, base.drive.node()) self.pusher.addCollider(player_c, self.player, base.drive.node()) def up_key(self): self.player.setY( self.player.getY() + 1 ) def down_key(self): self.player.setY( self.player.getY() - 1 ) def right_key(self): self.player.setX( self.player.getX() + 1 ) def left_key(self): self.player.setX( self.player.getX() - 1 ) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
cd <先ほど保存したディレクトリ> python hoge.py