見出し画像

Pythonでマイクラを作る ①Panda3Dの基礎

Pythonでマイクラそのものを作ろうという無謀な挑戦を始めます。名付けて「Pynecrafter(仮)」をプログラムしていきます。

pynecrafter ver0.3

開発中の画面です。モブの追加やマルチプレイヤー対応などの拡張を予定しております。
長期連載になりそうですが、完走できるように頑張りたいです。応援よろしくお願いします。

対象読者

  • マイクラが好き。「マイクラをいちから作れたら楽しいだろうな」と思っている方。

  • Python初学者。簡単なプログラムを書いたことがある方(適宜説明を入れていきます。興味と根性があれば大丈夫かと)

  • 3Dゲームを作ってみたい方。マイクラは3Dゲームの要素を多く含んでいるので、別のゲームを作るときに参考になるでしょう。

  • 英単語の最小限の知識をお持ちの方。プログラミングの変数名、関数名などは英単語を使いますので、英単語を知っている方が有利です。

  • Windows、Macのパソコンをお使いの方。操作はMacを標準で書いていきますので、Windowsの方は適宜読み替えてください。Windowsでの操作を括弧で追記する場合があります。

Panda3Dライブラリ

我々の武器はPanda3Dという3Dゲーム作成ライブラリです。Panda3Dを使うことで、3Dゲームの必須の処理である「モデルの配置や移動」「カメラ操作」などをライブラリにお任せ(処理を委譲)することができます。我々は比較的容易にゲームを完成させることができるようになります。
フリー(無料)であり、かつ最新のPythonに対応しています。必要十分な機能を備えた素晴らしいライブラリです。Pythonで3Dゲームを作成するなら、第一の候補に上がってきます。

連載第一回の課題は「Panda3D」の基礎を理解し、3Dワールドに立方体(キューブ)のブロックを配置する方法を学びます。

Panda3Dのインストール

お使いのパソコンにPython(バージョン3)がインストールされているものとします。まだインストールしていない方は、下記のサイトなどを参考にインストールしてください。

ターミナル(PowerShell)を開いて、Pythonがインストールできているか確認してみましょう。
python3 -V↩️(python -V↩️)
Macのコマンドの次に、括弧でWindowsのコマンドを追記しています。

% python3 -V
Python 3.x.x  # x には数字が入ります。

Panda3Dをインスールするコマンドを実行します。
pip3 install panda3d↩️(pip install panda3d↩️)

% pip3 install panda3d  
DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621
Collecting panda3d
  Using cached panda3d-1.10.11.post1-cp39-cp39-macosx_11_0_universal2.whl (115.8 MB)
Installing collected packages: panda3d
  DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621
DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621
Successfully installed panda3d-1.10.11.post1

2022.6.25時点で、最新版のpanda3d-1.10.11がインストールできました。

プログラミングの準備

初めてのPanda3Dプログラミングを書いてみましょう。パソコンの任意の場所(ドキュメントディレクトリをおすすめします)に「pynecrafter」ディレクトリを作成します。この中に、Pythonファイルを作成していきます。

# ディレクトリ構造
Documents/
  ├ pynecrafter/
  │  ├ 01_01_showbase.py
  │  ├ 01_02_showbase.py
  │  ├ 01_03_showbase.py
  │  ├ xxx.py
  │  

パソコンに初めからインストールされているテキストエディターでもプログラミング可能ですが、便利な機能が含まれているプログラミング専用エディターの使用を強くおすすめします。
無料のエディターとして、Visual Studio Code、Pycharm Communityなどがありますから、試してみてください。慣れるまで少し手間がかかりますが、プログラミングの効率が何倍にもアップします。

Microsoft謹製の人気のエディター。プラグインでPython機能を追加して使用します。

Jetbrains製のPython専用エディター。インストールしたら、すぐにプログラムを書き始めることができます。必要によりプラグインで日本語化してください。Communityバージョンは無料で使えます。(筆者はこちらの Professinalバージョンで開発しております。)

Showbaseでウインドウを作成する

pynecrafterディレクトリの中に「01_01_showbase.py」という名前のファイルを作成します。以下のコードを記載します。

"""01_01_showbase.py"""
from direct.showbase.ShowBase import ShowBase
from panda3d.core import *


class App(ShowBase):
    # コンストラクタ
    def __init__(self):
        # ShowBaseを継承する
        ShowBase.__init__(self)


app = App()
app.run()

# で始まる行や """ で囲まれている部分は、プログラムの説明文なので入力しなくても構いません。プログラムの勉強のためには、コードを一文字ずつ打ち込んでいくべきですが、面倒だと思ったらサクッとコピペしても構いません。

プログラム(01_01_showbase.py)の説明をします。
from で始まる行は、ライブラリを読み込む処理を実行します。Showbaseは主に画面描画の機能をまとめたクラスです。panda.coreは、3Dゲームを作成する上で便利な機能がまとめられています。「import *」として、全てを読み込んで使えるようにします。
class App(Showbase): はShowbaseクラスをもとに、Appクラスを作成します。コンストラクタ(def __init__)は初期化メソッドを意味し、オブジェクトを作成するときに実行する処理を記載します。ShowBase.__init__(self): と記載すると、Showbaseクラスのプロパティーを初期化します。これで SHowbaseクラスのインスタンス変数やメソッドを全て引き継ぐことができます。
そして最後、app = App() のより、Appインスタンスを作成し、変数appに代入します。app.run() により、runメソッドを実行し、画面を描画します。

Pythonプログラムを実行するには、Pythonファイルが存在するディレクトリで、次のコマンドを実行します。
python3 01_01_showbase.py↩️(python 01_01_showbase.py↩️)

% cd Documents/pynecrafter # Pythonファイルの置き場所に移動
% python3 01_01_showbase.py 
Known pipe types:
  CocoaGraphicsPipe
(all display modules loaded.)
01_01_showbase.py

デフォルトのサイズ(800x600)のグレーのウインドウが表示できれば成功です。(もしウインドウが表示できないときは、ターミナルのエラーメッセージを参考にプログラムを見直してみましょう。)
何も表示されない、つまらない画面と思われたかもしれませんが、これが全ての3Dゲームの土台になります。ここに機能を付け足していくことで、マイクラ・クローンに発展させることが可能なのです。

次に、立方体(キューブ)を配置するプログラムを見ていきましょう。

モデルの読み込みと配置

"""01_02_showbase.py"""
from direct.showbase.ShowBase import ShowBase
from panda3d.core import *


class App(ShowBase):
    # コンストラクタ
    def __init__(self):
        # ShowBaseを継承する
        ShowBase.__init__(self)

        # ブロックを一つ置く
        self.cube = self.loader.loadModel('models/misc/rgbCube')
        self.cube.setPos(0, 10, 0)
        self.cube.reparentTo(self.render)


app = App()
app.run()

01_01_showbase.py をコピーして、01_02_showbase.py を作成します。
# ブロックを一つ置く 以下の3行を追記しました。self.loader.loadModel() により3Dモデルを読み込みます。3Dモデルの置き場所は、'models/misc/rgbCube' と指定してください。先ほどインストールしたPanda3Dライブラリにデフォルトで含まれているキューブのモデルを読み込むことができます。

インスタンス変数cubeは読み込んだモデルが代入されています。self.cube.setPos(0, 10, 0) と指定すると、モデルの位置を座標 (0, 10, 0)に移動します。self.cube.reparentTo(self.render) によりモデルを画面に表示します。
座標とself.renderの説明は次回に譲ります。

Pythonプログラムを実行するには、Pythonファイルが存在するディレクトリで、次のコマンドを実行します。
python3 01_02_showbase.py↩️(python 01_02_showbase.py↩️)
ここより先は実行コマンドの記載は省略。

01_02_showbase.py

画面の中央に緑の四角が表示されたら成功です。この図形は3次元のキューブなのですが、真横から見ているので2次元の正方形に見えますね。カメラを移動させてモデルを斜めから見てみましょう。

  • 画面上で左クリックしながらドラッグ = 平行移動

  • 画面上で右クリックしながらドラッグ = 前後移動

  • 画面上で中央クリックしながらドラッグ = 回転

カメラの移動

次にウインドウの設定とカメラ移動について学びます。

ウインドウの設定とカメラの移動

"""01_03_showbase.py"""
from direct.showbase.ShowBase import ShowBase
from panda3d.core import *


class App(ShowBase):
    # コンストラクタ
    def __init__(self):
        # ShowBaseを継承する
        ShowBase.__init__(self)

        # ウインドウの設定
        self.properties = WindowProperties()
        self.properties.setTitle('Showbase sample')
        self.properties.setSize(1200, 800)
        self.win.requestProperties(self.properties)
        self.setBackgroundColor(0, 0, 0)

        # マウス操作を禁止
        self.disableMouse()
        # カメラの設定
        self.camera.setPos(5, 0, 10)
        self.camera.lookAt(0, 10, 0)

        # ブロックを一つ置く
        self.cube = self.loader.loadModel('models/misc/rgbCube')
        self.cube.setPos(0, 10, 0)
        self.cube.reparentTo(self.render)


app = App()
app.run()

01_02_showbase.py をコピーして、01_03_showbase.py を作成します。# ウインドウの設定、カメラの設定部分を追記します。

まずウインドウの設定について説明します。
WindowPropertiesクラスは、panda3d.coreに含まれるウインドウ設定機能です。self.properties = WindowProperties() によりインスタンス変数propertiesにWindowPropertiesオブジェクトを代入します。setTitleメソッドでウインドウのタイトル文字を変更できます。setSizeメソッドでウインドウのサイズを変更できます。self.win.requestProperties(self.properties) により、ウインドウの設定を反映させます。self.setBackgroundColor() でウインドウの背景色を変更します。(0, 0, 0) はRGB値で「黒」を表します。
RGB値についても次回説明します。

プログラムでカメラをコントロールするには、まずマウスでのカメラ操作を不可にする必要があります。self.disableMouse()
インスタンス変数cameraは、デフォルトのカメラが代入されており、setPosメソッドでカメラの位置(視点)を指定し、lookAtメソッドでカメラが見ている中心の座標を指定することで、カメラの向きを変更します。

01_03_showbase.py

01_03_showbase.py を実行すると、座標(0, 10, 0) にあるキューブを、カメラ位置(5, 0, 10)から眺めた画面が表示されます。タイトルが「Showbase sample」に、背景色が黒に変わっていることも確認できました。成功です。

次回は、今回の宿題である「座標」「RGB値(色)」「self.render」について説明します。いずれも3Dゲームのお作法で難しい概念になりますが、できるだけ具体的に分かりやすく説明することを目指します。


前の記事
Processing でグラフを描く㉒ 鳥と餌のシミュレーション
次の記事
Pythonでマイクラを作る ②3Dゲームの基礎(座標、色、シーングラフ)

その他のタイトルはこちら


この記事が気に入ったらサポートをしてみませんか?