PyOgreとPyODEの連携!

簡単な支援ユーティリティを作ってみた。

tags:python, 3d, tips
created:2007-02-05T20:24:24

PyOgreとPyODEの連携1。 PyOgreとPyODEの連携を支援するユーティリティの実現。 (python-ogreがリリースされたのでこちらの記事はもう古いです。)

ユーティリティライブラリの目的

PyOgreとPyODEの連携はいろいろいじってはいたんですが、 なかなかそれぞれのやることが整理できなかったんです。

ようやく少し簡単にアプリケーションが構築できるようになりましたので まだまだ荒削りですが公開することにしました。

特徴

  • デバイスセッティングダイアログの初回表示と起動2回目以降の隠蔽
  • グローバルリソースをApplicationクラスのプロパティに集約
  • 視点ビューからのオブジェクトピッキング支援
  • 「フレームリスナ」によるタスク構築支援
  • OgreノードとODEボディ、ODEジオメトリの融合
  • 球とボックスの基本メッシュの提供
  • OgreメッシュからのODEコリジョン検出ジオメトリの生成

詳しくはバンドルされたソースの「ogreutils」フォルダ内のソースを参照。

クラスリスト

Application

デバイスコンフィギュレーションや標準的なイベントハンドリングと シーンセッティングの基本だけを行います。 ユーザーアプリはこのApplicationクラスを継承して作成します。

constructScene:
オーバーライドしてシーンに追加するオブジェクトを作成しまくってください。
addFrameListener
他のフレームリスナ(フレームごとに行う処理を持った)の追加。
mouseDragged、mouseMoved、mousePressed、mouseReleased
マウス関係のイベントハンドリング
keyPressed、keyReleased、keyClicked
キー関係のイベントハンドリング
onObjectClick
マウスカーソルでオブジェクトをクリックしたことをハンドリング 近い順にイベントが発生します。 ハンドラの返値がTrueの時そのクリックに関するイベント発生は完了します。
WalkListener
マウスによる空間内移動サンプルタスク インスタンスをApplication.addFrameListenerにて追加することで、 マウスによる視点変更とホーイルによる前進後進ができます。
ActorObject
ODEによるコリジョン判定を伴った運動シミュレーション付きオブジェクト コリジョン判定には球とボックスをサポート (シリンダはODE0.5相当ではカプセルスタイルしか対応していません。 ODE0.6がリリースされてから検討します。)
ObstacleObject
ODEによるコリジョン判定を伴ったオブジェクト(運動なし) コリジョン判定にはプレーンと球とボックス、メッシュをサポート (シリンダはODE0.5相当ではカプセルスタイルしか対応していません。 ODE0.6がリリースされてから検討します。)

テストアプリケーションソースコード

# -*- encoding:utf-8 -*-

import sys
import ogreutils
from pyogre import ogre
import ode

class App(ogreutils.Application):
  def constructScene(self, scene_manager):
    ogreutils.Application.constructScene(self, scene_manager)
    scene_manager.setSkyBox(True, "Examples/SceneSkyBox2");
    light1 = scene_manager.createLight("Light1")
    light1.type = ogre.Light.LT_DIRECTIONAL
    light1.direction = 1,-1,1
    light1.diffuseColour = 1, 1, 1
    light1.specularColour = 1, 1, 1

    self.ball1 = ogreutils.ActorObject('ball1', position=(-10,400,0),
      scale=(57.1, 57.1, 57.1), shape=ogreutils.SPHERE_SHAPE)

    ogreutils.ObstacleObject('cylinder', position=(0,50,0),
      scale=(50,50,50), mesh="cylinder", shape=ogreutils.TRIMESH_SHAPE)

    ogreutils.ObstacleObject('ball2', position=(-100,50,0),
      scale=(50,50,50), shape=ogreutils.SPHERE_SHAPE)

    self.floor = ogreutils.ObstacleObject('floor', shape=ogreutils.PLANE_SHAPE)

if __name__ == "__main__":
  app = App()
  app.setup(sys.argv[1:]==['-c'])
  app.addFrameListener(ogreutils.WalkListener())
  app.run()

テストアプリケーションスクリーンショット

../../../_images/screenshot_1.png

サンプルソース及びユーティリティライブラリ&メディアファイル : ダウンロード

感想

PyOgreは至れり尽くせりな豊富な機能群がそろっているのですが、 サンプルがまだまだ少ないですね~。

Ogre.Netのサンプルとかが意外に参考に!

今後はこのユーティリティを使っていろんなサンプルを公開していきます。