glutでODE
テスト中
- ObjectBase.h
- ObjectBase.cpp
- SimpleSphere.h
- SimpleSphere.cpp
- SimpleBox.h
- SimpleBox.cpp
- SimpleCylinder.h
- SimpleCylinder.cpp
- SimpleCappedCylinder.h
- SimpleCappedCylinder.cpp
- SampleMonkey.h
- SampleMonkey.cpp
- XReader.h
- StlReader.h
- main.cpp
剛体表示。落下。
地面に衝突。
地面に衝突。
- 実装機能
- Sphere(球体)の生成、表示
- glutによるグラフィック表示
- Box(箱)の生成、表示
- vectorにより、3D表示の自動化
- groundをObjectBaseに変更
- Cylinder(円柱)、CappedCylinder(カプセル)オブジェクト追加
- 影表示(簡易のシャドウマトリックスを使用)
- gluiによるGUI表示。
- カメラ操作をgluiに変更。(まだ適当。)
- STLファイル、Xファイル読み込み、表示(Meshのみ)
- ハイトフィールド表示(bitmapデータから)
下記のチュートリアルを参考にしてます。
- http://artis.imag.fr/Membres/Xavier.Decoret/resources/ode/tutorial1.html
- ObjectBase.h
重要な部分は、render()とrenderInLocalFrame()=0の実装。
3D表示のための簡易的な機構になります。
3D表示のための簡易的な機構になります。
#include <ode/ode.h>
class ObjectBase
{
protected:
dBodyID m_body;
dGeomID m_geom;
bool m_flagShadow;
public:
ObjectBase();
~ObjectBase();
virtual void render();
virtual void renderShadow();
void setPosition(dReal x, dReal y, dReal z);
const dReal* getPosition() const;
const dBodyID& body() const;
const dGeomID& geom() const;
protected:
virtual void renderInLocalFrame() const = 0;
};
void ObjectBase::render() const
{
const dReal *p = dBodyGetPosition(body);
const dReal *r = dBodyGetRotation(body);
float m[16];
m[ 0] = (GLfloat)r[ 0]; m[ 1] = (GLfloat)r[ 4]; m[ 2] = (GLfloat)r[ 8]; m[ 3] = (GLfloat)0;
m[ 4] = (GLfloat)r[ 1]; m[ 5] = (GLfloat)r[ 5]; m[ 6] = (GLfloat)r[ 9]; m[ 7] = (GLfloat)0;
m[ 8] = (GLfloat)r[ 2]; m[ 9] = (GLfloat)r[ 6]; m[10] = (GLfloat)r[10]; m[11] = (GLfloat)0;
m[12] = (GLfloat)p[ 0]; m[13] = (GLfloat)p[ 1]; m[14] = (GLfloat)p[ 2]; m[15] = (GLfloat)1;
glMultMatrixf( m );
renderInLocalFrame();
}