カーシムを作ってみよう。

PythonOgreでカーシムを

tags:python, 3d, tips
created:2007-10-30T23:20:20

カーシム作りたいんです。 PythonOgreでカーシムを作ってみよう。

動機付け

「Viper Racing」

私は、このゲームが大好きなんです。 このゲームの特徴は、

  • 挙動がリアル指向
  • リアルに車が壊れる
  • CPUカーがズルをせず賢いAIで動く

最初の点は最近良く見られるようになりました。 後者2点がこのゲームならではの特徴かと思います。

この特徴のおかげでものすごい緊張感のあるレースが楽しめます。 テールトゥノーズ、サイドバイサイドという表現を実感できます。 サイドバイサイドでは寄せすぎると、CPUカーが少し間隔を開けたりします。 テールトゥノーズでは小突く以上の当たりは後ろが不利になるので CPUカーはぶつからないようにスピードを合わせて来ます。 ミラー見ながらブロックしたりという駆け引きが楽しめる数少ないレースゲームです。

残念なことに、これらの要素のために見た目は控えめに作られています。 そしてコースや車種収録数が少ないです。 車種はDodgeViperGTS1車種オンリーという徹底振り。 そのせいかあまり日本人にはウケがよくなかったんだろうと思います。

コース・車種・見た目以外は徹底したこだわりが見られます。 アライメントフォースをフォースフィードバックハンドルで感じられるところは、 最新のゲームでもほとんどないですね。これほどのゲームが10年前に出ていたことに驚きです。

最近では「Forza2」がこれに近いコンセプトですが、 ViperRacingに比べると車の壊れ方やぶつけぶつけられの緊張感がやや少ない気がします。 いや、Forza2を実際にやったわけではなく、 ここ を読んだり動画を見ただけなんですが。

いずれこのViperRacingのようなゲームをつくってみたいなーという気持ちからいろいろ実験を開始しました。

レースゲームの構成

  • 描画エンジン
  • 物理エンジン
  • 立体効果音処理
  • 入力デバイス処理
  • AIエンジン

これらの連携によりレースゲームが構成されています。

描画エンジンには「Ogre3D」のpythonバインディングである「PythonOgre」を。 物理エンジンには「PythonOgre」に含まれる「OgreOde」を。 立体効果音処理には「PythonOgre」に含まれる「OgreAL」を。 入力デバイス処理には「PythonOgre」に含まれる「OIS」を使おうと思っています。 AIはだいぶ後から考えようと思います。

ほとんどがpython-ogre1本でそろう形ですね。 Pythonバインディングは利用が容易で、誰でもすぐに開発環境を立ち上げられます。 (素のC++版では依存ライブラリのセットアップが大変!)

これらの組み合わせ自体には意外とコード量を必要としません。 ゲーム作り全般に言えることですが、ちゃんとしたものにするには 素材の作成や確保の方が重要になってきます。 この当たりはViperRacingに習い、最小限にとどめた上で進めていこうと思います。

物理エンジンの選択

これらの選択肢のなかでは、ODEをラップした「OgreOde」が、一番使い勝手がよかった。 本命は「bullet」ですが、簡単に事を始めるのにいいでしょうということで、 まずは「OgreOde」で進めたいと思います。

ODE

古くからあるオープンソースの物理エンジン。 見た目のノード、運動用ボディ、衝突用ジオメトリと複数のオブジェクトを関連付けて使うのですが、 C言語ベースなので関連付けコードの見通しが悪いという欠点があります。

「OgreOde」ではオブジェクト指向のラップがなされておりこの欠点をカバーしています。 (「PyODE」もオブジェクト指向のラップをしたPythonモジュール)

開発元は こちら

Newton

Delphi製?オブジェクト指向でかなり親切なつくり。

ランタイム+SDK配布でソースはクローズだったような?

開発元は こちら

PhysX

AGEIA社が提供する「PhysX」は物理演算ハードウェア「PPU」とセットとなるAPIセット。 商用なだけにかなりニッチな機能実装にも意欲的。 ハードウェア経由なだけに、単純な限界性能は他の追随を許さない。 (ソフトウェアエミュレーションモードはかなり厳しい。)

開発元は こちら

bullet

業界標準を目指すCOLLADAフォーマットをいち早くサポートしているため、 最近注目のオープンソース物理エンジン。 オブジェクト指向でかなり親切なつくり。

blenderの物理エンジンとしての採用をはじめ、 PS3向けタイトルでも採用されているらしい。

開発元は こちら

まずは基本をチェック

Ogre3Dの仕組みを抑えていきます。

Ogre::Root(Ogreルートオブジェクト)

最初に必ず作成しておくオブジェクトです。 レンダリング設定したり、初期化するのに使います。

シーンノードとは違います。

現在の進捗状況

現在は走り回れるだけでゲームになっていません。 素材はOgreOdeデモに使われていたもの。

スクリーンショット

F4キー
車乗り換え
カーソルキー
加速、減速、ハンドル
Bキー
バック
マウスレフトクリック
画面に対するマウスポジションに応じた加速、減速、ハンドル
マウスライトクリック
画面下半分でバック
ESCキー
終了
SPACEキー
車を初期位置に戻す

ソースダウンロード

以下のアドレスにリポジトリを置いておきます。

http://python.matrix.jp/repos/race

以下の操作で最新のソースをダウンロードできます。

mkdir race
cd race
hg init
hg pull -u http://python.matrix.jp/repos/race

上記コマンドの実行にはmercurialが必要です。 詳しくは Pythonで分散バージョン管理 を参照してください。

実行には「python-ogre」のインストールが必要です。 詳しくは python-ogreの開発環境整備 を参照してください。

CarSim.pyを実行すればはじめて起動した時はレンダリング設定ダイアログが出ます。 2度目以降保存された設定で動作します。

もう一度設定ダイアログを出したい場合、「ogre.cfg」を削除してください。

バイナリフローズン

「freeze.py」はバイナリフローズンを作成するスクリプトです。 あらかじめ「bbfreeze」モジュールがインストール済みである必要があります。

詳しくは bbfreezeでバイナリ作成 を参照。

動画でみてみる

サンプル動画