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()
テストアプリケーションスクリーンショット
サンプルソース及びユーティリティライブラリ&メディアファイル : ダウンロード
感想
PyOgreは至れり尽くせりな豊富な機能群がそろっているのですが、 サンプルがまだまだ少ないですね~。
Ogre.Netのサンプルとかが意外に参考に!
今後はこのユーティリティを使っていろんなサンプルを公開していきます。