Panda3D 3次元ゲームエンジン入門

【概要】Panda3Dは、オープンソースの3次元ゲームエンジンであり、可視化やシミュレーションの機能を持つ。本記事では、Panda3Dの基本的な使い方として、画面の表示、3次元モデルの読み込みと配置、キーボード・マウスイベントの処理、オブジェクトの移動、衝突判定について解説する。

【目次】

  1. 前準備
  2. Panda3Dを用いて画面を開く
  3. マウス操作
  4. シーンへのegg形式ファイルの3次元モデルの読み込み
  5. 3次元モデルの配置
  6. キーボードイベントのイベントハンドラ
  7. マウスイベントのイベントハンドラ
  8. getX(), setX()などでオブジェクトを動かす
  9. オブジェクトを自動で動かす
  10. オブジェクトの速度
  11. 衝突判定

【サイト内の関連ページ】

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
Panda3Dのインストール

2. Panda3Dを用いて画面を開く

まず、Panda3Dの最小構成のプログラムを作成し、画面を表示する。

  1. テキストエディタを用いてファイルを作成する。テキストファイルの中身を次のように書く。
    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の基本クラスであり、ウィンドウの作成やイベント処理などの基本機能を提供する。

    Panda3Dの基本コード
  2. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  3. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  4. 何も無い、黒めの灰色の画面が表示されることを確認する。

    結果を確認したら、右上の「x」をクリックして終了する。

    Panda3Dの初期画面

演習問題: 上の手順で画面を開きなさい

3. マウス操作

セクション2では空の画面を表示した。このセクションでは、3次元モデルを読み込んで表示し、マウスで視点を操作する方法を学ぶ。

プログラムでは「scene」という名前のオブジェクトを作成する。

reparentTo()メソッドは、オブジェクトをシーングラフ(3次元空間の階層構造)に追加する。self.renderはPanda3Dのルートノードであり、ここに追加されたオブジェクトが画面に表示される。

  1. テキストファイルの中身を次のように書き替える。
    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()
    
    環境モデル読み込みコード
  2. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  3. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  4. 3次元モデルが表示されることを確認する。
    環境モデルの表示結果
  5. マウス操作
    • 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
    • 右ボタンを押しながらマウスを動かす: 視点移動(前後)

    結果を確認したら、右上の「x」をクリックして終了する。

演習問題: 上の手順で3次元モデルを表示しなさい。マウス操作も行いなさい。

4. シーンへのegg形式ファイルの3次元モデルの読み込み

セクション3では1つの3次元モデルを読み込んだ。このセクションでは、複数のモデルを読み込む方法を学ぶ。

egg形式とは、Panda3D独自の3次元モデルファイル形式である。テクスチャ、アニメーション、衝突判定用の形状などを含めることができる。拡張子が「.egg.pz」のファイルは、egg形式を圧縮したものである。

以下の2つのファイルを読み込む

  1. C:\Program Files\Python312\Lib\site-packages\panda3d\models\を開くと、「.egg.pz」のファイルがあることを確認する。

    これらは3次元モデルのファイルである。

    modelsフォルダの内容
  2. 今度は、C:\Program Files\Python312\Lib\site-packages\panda3d\models\misc\を開くと、ここにも「.egg.pz」のファイルがあることを確認する。
    miscフォルダの内容
  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()
    
    2つのモデル読み込みコード
  4. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  5. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  6. 2つの3次元モデル(竹林と立方体)が表示されることを確認する。

    立方体は、画面中央に緑色で現れる。

    2つのモデルの表示結果
  7. マウス操作
    • 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
    • 右ボタンを押しながらマウスを動かす: 視点移動(前後)

    結果を確認したら、右上の「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では複数のモデルを読み込んだ。このセクションでは、モデルの位置、大きさ、回転を制御する方法を学ぶ。

位置を指定して配置

座標系の説明図
  1. テキストファイルの中身を次のように書き替える。
    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()
    
    2つの立方体配置コード
  2. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  3. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  4. 立方体が2つ表示されることを確認する。
    2つの立方体の表示結果
  5. マウス操作
    • 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
    • 右ボタンを押しながらマウスを動かす: 視点移動(前後)

    結果を確認したら、右上の「x」をクリックして終了する。

演習問題: 上の手順で2つの立方体を表示しなさい。マウス操作も行いなさい。

setScale()で拡大縮小

  1. テキストファイルの中身を次のように書き替える。
    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()
    
    拡大縮小コード
  2. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  3. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  4. 右側の立方体が2.4倍に拡大されていることを確認する。
    拡大された立方体
  5. マウス操作
    • 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
    • 右ボタンを押しながらマウスを動かす: 視点移動(前後)

    結果を確認したら、右上の「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()
5つの立方体のコード
5つの立方体の表示結果

setQuat()で回転

egg形式ファイルの3次元モデルであるC:\Program Files\Python312\Lib\site-packages\panda3d\models\misc\rgbCube.eggも読み込む。

  1. テキストファイルの中身を次のように書き替える。
    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()
    
    回転コード
  2. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  3. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  4. 右側の立方体が回転していることを確認する。
    回転した立方体
  5. マウス操作
    • 左ボタンを押しながらマウスを動かす: 視点移動(上下左右)
    • 右ボタンを押しながらマウスを動かす: 視点移動(前後)

    結果を確認したら、右上の「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()
5つの回転立方体のコード
5つの回転立方体の表示結果

6. キーボードイベントのイベントハンドラ

セクション5までは静的なシーンを扱った。このセクションからは、ユーザーの入力に応じてオブジェクトを変化させる方法を学ぶ。まず、キーボード入力への対応方法を説明する。

キーコードの種類

"A"、"space"、"enter"、"arrow_left"、"arrow_up"、"arrow_down"、"arrow_right"など

self.accept()メソッドは、指定したキーが押されたときに呼び出す関数(イベントハンドラ)を登録する。

  1. テキストファイルの中身を次のように書き替える。
    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()
    
    キーボードイベントコード
  2. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  3. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  4. 立方体が表示されることを確認する。
    立方体の初期表示
  5. キーボードの「A」キーを押すと、大きな立方体に変わることを確認する。
    Aキー押下後の立方体

    結果を確認したら、右上の「x」をクリックして終了する。

演習問題: 上の手順で立方体を表示しなさい。キーボードの「A」キーを押す操作も行いなさい。

演習問題2: スペースキーに反応するように、プログラムを次のように書き換えて実行しなさい。


        self.accept( "space", self.space_key )

    def space_key(self):
        self.cube.setScale(5)

スペースキーのコード
スペースキー押下後の結果

7. マウスイベントのイベントハンドラ

セクション6ではキーボード入力を扱った。このセクションでは、マウスボタンのクリックに応じてオブジェクトを変化させる方法を学ぶ。

マウスボタンのコード

"mouse1"(左ボタン)、"mouse2"(中ボタン)、"mouse3"(右ボタン)

  1. テキストファイルの中身を次のように書き替える。
    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()
    
    マウスイベントコード
  2. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  3. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  4. 立方体が表示されることを確認する。
    立方体の初期表示
  5. マウスの右ボタンをクリックすると、小さな立方体に変わることを確認する。
    右クリック後の立方体
  6. マウスの左ボタンをクリックすると、大きな立方体に変わることを確認する。
    左クリック後の立方体

    結果を確認したら、右上の「x」をクリックして終了する。

演習問題: 上の手順で立方体を表示しなさい。右と左のマウスボタンを押す操作も行いなさい。

8. getX(), setX()などでオブジェクトを動かす

セクション6、7ではオブジェクトの大きさを変えた。このセクションでは、キー入力に応じてオブジェクトの位置を変更し、移動させる方法を学ぶ。

  1. テキストファイルの中身を次のように書き替える。
    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()
    
    矢印キー操作コード
  2. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  3. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  4. 立方体が表示されることを確認する。
  5. キーボードの矢印キー(上、下、右、左)でオブジェクトが移動することを確認する。
    矢印キーでの移動結果

    結果を確認したら、右上の「x」をクリックして終了する。

演習問題: 上の手順で立方体を表示しなさい。キーボードの矢印キー(上、下、右、左)でオブジェクトが移動することを確認しなさい。

9. オブジェクトを自動で動かす

セクション8ではキー入力のたびにオブジェクトを移動させた。このセクションでは、ユーザーの入力なしに、フレームごとに自動でオブジェクトを移動させる方法を学ぶ。

  1. テキストファイルの中身を次のように書き替える。
    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()
    
    自動移動コード
  2. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  3. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  4. オブジェクトが自動で移動することを確認する。
    自動移動の初期状態
    自動移動後の状態

    結果を確認したら、右上の「x」をクリックして終了する。

演習問題: 上の手順で立方体を表示しなさい。オブジェクトが動くことを確認しなさい。

10. オブジェクトの速度

セクション9では経過時間に基づいて位置を計算した。このセクションでは、速度の概念を導入し、キー入力で速度を変更することで、より自然な動きを実現する方法を学ぶ。

  1. テキストファイルの中身を次のように書き替える。
    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()
    
    速度制御コード
  2. テキストファイルを保存する。

    ファイル名は何でもよいが、日本語などの全角文字は避ける。拡張子は「.py」にする。

  3. Pythonプログラムの実行

    Pythonプログラムの実行: 別ページ »で説明

    cd <先ほど保存したディレクトリ>
    python hoge.py
    
    コマンドプロンプトでの実行
  4. 立方体が表示されることを確認する。
    立方体の初期表示