Panda3d は,3次元のゲームエンジン.
3次元のオブジェクトを使って,ダイナミックな何か(マウスやキーボード操作で何か)をしたいときには,Panda3d や Unreal Engine 4 などのゲームエンジンを使うのが便利
【このページの目次】
サイト内の関連資料:
先人に感謝.
Python の URL: http://www.python.org/
インストール手順の詳細は: 別ページで説明している.
コマンドプロンプトを管理者として実行し,次のコマンドを実行.
python -m pip install -U pip setuptools python -m pip install -U jupyterlab jupyter jupyter-console jupytext nteract_on_jupyter spyder
システム Python を使用(インストール操作は不要)
端末で,次のコマンドを実行.
sudo apt -y install python3-dev python3-pip python3-setuptools sudo pip3 uninstall ptyprocess sniffio terminado tornado jupyterlab jupyter jupyter-console jupytext nteract_on_jupyter spyder sudo apt -y install jupyter jupyter-qtconsole spyder3 sudo apt -y install python3-ptyprocess python3-sniffio python3-terminado python3-tornado sudo pip3 install jupyterlab nteract_on_jupyter
from direct.showbase.ShowBase import ShowBase class HelloWorld(ShowBase): def __init__(self): ShowBase.__init__(self) app = HelloWorld() app.run()
ファイル名は何でもよいが、日本語などの全角文字は避ける.拡張子は「.py」にする.
※ Python プログラムを動かすために, Windows では,「python」コマンドを使う. Ubuntu では「python3」コマンドを使う.
開発環境や Python コンソール(Jupyter Qt Console,spyder,PyCharm,PyScripter など)も便利である.
cd <先ほど保存したディレクトリ> py 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」にする.
Windowsのコマンドプロンプトを使いたい場合には, 次のコマンドを実行.
cd <先ほど保存したディレクトリ> ppython 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」にする.
Windowsのコマンドプロンプトを使いたい場合には, 次のコマンドを実行.
cd <先ほど保存したディレクトリ> ppython 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」にする.
Windowsのコマンドプロンプトを使いたい場合には, 次のコマンドを実行.
cd <先ほど保存したディレクトリ> ppython 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」にする.
Windowsのコマンドプロンプトを使いたい場合には, 次のコマンドを実行.
cd <先ほど保存したディレクトリ> ppython 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:\Panda3D-1.9.4-x64\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」にする.
Windowsのコマンドプロンプトを使いたい場合には, 次のコマンドを実行.
cd <先ほど保存したディレクトリ> ppython 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」にする.
Windowsのコマンドプロンプトを使いたい場合には, 次のコマンドを実行.
cd <先ほど保存したディレクトリ> ppython 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」にする.
Windowsのコマンドプロンプトを使いたい場合には, 次のコマンドを実行.
cd <先ほど保存したディレクトリ> ppython 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」にする.
Windowsのコマンドプロンプトを使いたい場合には, 次のコマンドを実行.
cd <先ほど保存したディレクトリ> ppython 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」にする.
Windowsのコマンドプロンプトを使いたい場合には, 次のコマンドを実行.
cd <先ほど保存したディレクトリ> ppython 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」にする.
Windowsのコマンドプロンプトを使いたい場合には, 次のコマンドを実行.
cd <先ほど保存したディレクトリ> ppython 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()
本サイトは金子邦彦研究室のWebページです.サイトマップは,サイトマップのページをご覧下さい. 本サイト内の検索は,サイト内検索のページをご利用下さい.
問い合わせ先: 金子邦彦(かねこ くにひこ)