Panda3D 3次元ゲームエンジン入門
【概要】Panda3Dは、オープンソースの3次元ゲームエンジンであり、可視化やシミュレーションの機能を持つ。本記事では、Panda3Dの基本的な使い方として、画面の表示、3次元モデルの読み込みと配置、キーボード・マウスイベントの処理、オブジェクトの移動、衝突判定について解説する。
【目次】
- 前準備
- Panda3Dを用いて画面を開く
- マウス操作
- シーンへのegg形式ファイルの3次元モデルの読み込み
- 3次元モデルの配置
- キーボードイベントのイベントハンドラ
- マウスイベントのイベントハンドラ
- getX(), setX()などでオブジェクトを動かす
- オブジェクトを自動で動かす
- オブジェクトの速度
- 衝突判定
【サイト内の関連ページ】
1. 前準備
Panda3Dのプログラムは以下の基本構造を持つ:
┌─────────────────────────────────────┐
│ 1. モジュールのインポート │
│ from direct.showbase.ShowBase │
│ import ShowBase │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 2. アプリケーションクラスの定義 │
│ class MyApp(ShowBase) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 3. オブジェクトの作成 │
│ self.loader.loadModel(...) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 4. アプリケーションの実行 │
│ app.run() │
└─────────────────────────────────────┘
Python開発環境、ライブラリ類
ここでは、最低限の事前準備について説明する。機械学習や深層学習を行う場合は、NVIDIA CUDA、Visual Studio、Cursorなどを追加でインストールすると便利である。これらについては別ページ https://www.kkaneko.jp/cc/dev/aiassist.html で詳しく解説しているので、必要に応じて参照されたい。
Python 3.12 のインストール
インストール済みの場合は実行不要である。
管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行する。管理者権限は、wingetの--scope machineオプションでシステム全体にソフトウェアをインストールするために必要である。
REM wingetの利用開始のための承諾。質問が出た場合は「y」
winget list --accept-source-agreements
REM Python をシステム領域にインストール
winget install --scope machine --id Python.Python.3.12 -e --silent
REM Python のパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON_SCRIPTS_PATH=C:\Program Files\Python312\Scripts"
echo "%PATH%" | find /i "%PYTHON_PATH%" >nul
if errorlevel 1 setx PATH "%PATH%;%PYTHON_PATH%" /M >nul
echo "%PATH%" | find /i "%PYTHON_SCRIPTS_PATH%" >nul
if errorlevel 1 setx PATH "%PATH%;%PYTHON_SCRIPTS_PATH%" /M >nul
【関連する外部ページ】
Python の公式ページ: https://www.python.org/
AI エディタ Windsurf のインストール
Pythonプログラムの編集・実行には、AI エディタの利用を推奨する。ここでは、Windsurfのインストールを説明する。
管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行して、Windsurfをシステム全体にインストールする。管理者権限は、wingetの--scope machineオプションでシステム全体にソフトウェアをインストールするために必要となる。
winget install --scope machine Codeium.Windsurf -e --silent
【関連する外部ページ】
Windsurf の公式ページ: https://windsurf.com/
Panda3D のインストール手順
管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行して、システム全体にインストールする。
pip install panda3d
2. Panda3Dを用いて画面を開く
まず、Panda3Dの最小構成のプログラムを作成し、画面を表示する。
- テキストエディタを用いてファイルを作成する。テキストファイルの中身を次のように書く。
from direct.showbase.ShowBase import ShowBase class HelloWorld(ShowBase): def __init__(self): ShowBase.__init__(self) app = HelloWorld() app.run()このプログラムでは、ShowBaseクラスを継承したHelloWorldクラスを定義し、app.run()でアプリケーションを実行している。ShowBaseはPanda3Dの基本クラスであり、ウィンドウの作成やイベント処理などの基本機能を提供する。
- テキストファイルを保存する。
ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
cd <先ほど保存したディレクトリ> python hoge.py
- 何も無い、黒めの灰色の画面が表示されることを確認する。
結果を確認したら、右上の「x」をクリックして終了する。
演習問題: 上の手順で画面を開きなさい。
3. マウス操作
セクション2では空の画面を表示した。このセクションでは、3次元モデルを読み込んで表示し、マウスで視点を操作する方法を学ぶ。
プログラムでは「scene」という名前のオブジェクトを作成する。
reparentTo()メソッドは、オブジェクトをシーングラフ(3次元空間の階層構造)に追加する。self.renderはPanda3Dのルートノードであり、ここに追加されたオブジェクトが画面に表示される。
- テキストファイルの中身を次のように書き替える。
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」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
cd <先ほど保存したディレクトリ> python hoge.py
- 3次元モデルが表示されることを確認する。
- マウス操作
- 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
- 右ボタンを押しながらマウスを動かす: 視点移動(前後)
結果を確認したら、右上の「x」をクリックして終了する。
演習問題: 上の手順で3次元モデルを表示しなさい。マウス操作も行いなさい。
4. シーンへのegg形式ファイルの3次元モデルの読み込み
セクション3では1つの3次元モデルを読み込んだ。このセクションでは、複数のモデルを読み込む方法を学ぶ。
egg形式とは、Panda3D独自の3次元モデルファイル形式である。テクスチャ、アニメーション、衝突判定用の形状などを含めることができる。拡張子が「.egg.pz」のファイルは、egg形式を圧縮したものである。
以下の2つのファイルを読み込む。
- C:\Program Files\Python312\Lib\site-packages\panda3d\models\environment.egg.pz
- C:\Program Files\Python312\Lib\site-packages\panda3d\models\misc\rgbCube.egg.pz ※ miscの下
- C:\Program Files\Python312\Lib\site-packages\panda3d\models\を開くと、「.egg.pz」のファイルがあることを確認する。
これらは3次元モデルのファイルである。
- 今度は、C:\Program Files\Python312\Lib\site-packages\panda3d\models\misc\を開くと、ここにも「.egg.pz」のファイルがあることを確認する。
- テキストファイルの中身を次のように書き替える。
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」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
cd <先ほど保存したディレクトリ> python hoge.py
- 2つの3次元モデル(竹林と立方体)が表示されることを確認する。
立方体は、画面中央に緑色で現れる。
- マウス操作
- 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
- 右ボタンを押しながらマウスを動かす: 視点移動(前後)
結果を確認したら、右上の「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)
5. 3次元モデルの配置
セクション4では複数のモデルを読み込んだ。このセクションでは、モデルの位置、大きさ、回転を制御する方法を学ぶ。
位置を指定して配置
- プログラムでは「scene」、「cube1」、「cube2」という名前のオブジェクトを作成する。
- setPos(<x値>, <y値>, <z値>): 既定のカメラから見たとき、xは左右、yは前奥、zは上下を表す。
- テキストファイルの中身を次のように書き替える。
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」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
cd <先ほど保存したディレクトリ> python hoge.py
- 立方体が2つ表示されることを確認する。
- マウス操作
- 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
- 右ボタンを押しながらマウスを動かす: 視点移動(前後)
結果を確認したら、右上の「x」をクリックして終了する。
演習問題: 上の手順で2つの立方体を表示しなさい。マウス操作も行いなさい。
setScale()で拡大縮小
- プログラムでは「scene」、「cube1」、「cube2」という名前のオブジェクトを作成する。
- setScale(<スケール値>): 拡大縮小を行う。
- テキストファイルの中身を次のように書き替える。
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」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
cd <先ほど保存したディレクトリ> python hoge.py
- 右側の立方体が2.4倍に拡大されていることを確認する。
- マウス操作
- 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
- 右ボタンを押しながらマウスを動かす: 視点移動(前後)
結果を確認したら、右上の「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.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.setScale(0.6)
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.setScale(1.0)
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.setScale(1.4)
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.setScale(1.8)
app = HelloWorld()
app.run()
setQuat()で回転
egg形式ファイルの3次元モデルであるC:\Program Files\Python312\Lib\site-packages\panda3d\models\misc\rgbCube.eggも読み込む。
- プログラムでは「scene」、「cube1」、「cube2」という名前のオブジェクトを作成する。
- setQuat(<クオータニオン>): 回転を行う。クオータニオン(四元数)とは、3次元空間での回転を表現する数学的な方法である。Quat(w, x, y, z)の形式で指定し、回転軸と回転角度を表す。
- テキストファイルの中身を次のように書き替える。
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」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
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()
6. キーボードイベントのイベントハンドラ
セクション5までは静的なシーンを扱った。このセクションからは、ユーザーの入力に応じてオブジェクトを変化させる方法を学ぶ。まず、キーボード入力への対応方法を説明する。
キーコードの種類
"A"、"space"、"enter"、"arrow_left"、"arrow_up"、"arrow_down"、"arrow_right"など
self.accept()メソッドは、指定したキーが押されたときに呼び出す関数(イベントハンドラ)を登録する。
- テキストファイルの中身を次のように書き替える。
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」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
cd <先ほど保存したディレクトリ> python hoge.py
- 立方体が表示されることを確認する。
- キーボードの「A」キーを押すと、大きな立方体に変わることを確認する。
結果を確認したら、右上の「x」をクリックして終了する。
演習問題: 上の手順で立方体を表示しなさい。キーボードの「A」キーを押す操作も行いなさい。
演習問題2: スペースキーに反応するように、プログラムを次のように書き換えて実行しなさい。
self.accept( "space", self.space_key )
def space_key(self):
self.cube.setScale(5)
7. マウスイベントのイベントハンドラ
セクション6ではキーボード入力を扱った。このセクションでは、マウスボタンのクリックに応じてオブジェクトを変化させる方法を学ぶ。
マウスボタンのコード
"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」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
cd <先ほど保存したディレクトリ> python hoge.py
- 立方体が表示されることを確認する。
- マウスの右ボタンをクリックすると、小さな立方体に変わることを確認する。
- マウスの左ボタンをクリックすると、大きな立方体に変わることを確認する。
結果を確認したら、右上の「x」をクリックして終了する。
演習問題: 上の手順で立方体を表示しなさい。右と左のマウスボタンを押す操作も行いなさい。
8. getX(), setX()などでオブジェクトを動かす
セクション6、7ではオブジェクトの大きさを変えた。このセクションでは、キー入力に応じてオブジェクトの位置を変更し、移動させる方法を学ぶ。
- getX()、getY()、getZ(): オブジェクトの現在位置を取得する。
- setX()、setY()、setZ(): オブジェクトの位置を変更する。
- テキストファイルの中身を次のように書き替える。
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」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
cd <先ほど保存したディレクトリ> python hoge.py
- 立方体が表示されることを確認する。
- キーボードの矢印キー(上、下、右、左)でオブジェクトが移動することを確認する。
結果を確認したら、右上の「x」をクリックして終了する。
演習問題: 上の手順で立方体を表示しなさい。キーボードの矢印キー(上、下、右、左)でオブジェクトが移動することを確認しなさい。
9. オブジェクトを自動で動かす
セクション8ではキー入力のたびにオブジェクトを移動させた。このセクションでは、ユーザーの入力なしに、フレームごとに自動でオブジェクトを移動させる方法を学ぶ。
- self.taskMgr.add(): フレームごとに呼び出すメソッド(タスク)を登録する。Panda3Dは登録されたタスクを毎フレーム自動的に呼び出す。
- self.cube.setPos(0, 20, task.time * 0.2): 立方体の位置を少しずつ上へ移動する。task.timeはアプリケーション開始からの経過秒数である。
- テキストファイルの中身を次のように書き替える。
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」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
cd <先ほど保存したディレクトリ> python hoge.py
- オブジェクトが自動で移動することを確認する。
結果を確認したら、右上の「x」をクリックして終了する。
演習問題: 上の手順で立方体を表示しなさい。オブジェクトが動くことを確認しなさい。
10. オブジェクトの速度
セクション9では経過時間に基づいて位置を計算した。このセクションでは、速度の概念を導入し、キー入力で速度を変更することで、より自然な動きを実現する方法を学ぶ。
- テキストファイルの中身を次のように書き替える。
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」にする。
- Pythonプログラムの実行
Pythonプログラムの実行: 別ページ »で説明
cd <先ほど保存したディレクトリ> python hoge.py
- 立方体が表示されることを確認する。