ODE
をテンプレートにして作成
[
トップ
|
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
----
#contents
----
#include(build_ode,notitle)
#code(C){{
bool g_bWorldCreated = false;
void InitODE(void)
{
dInitODE2(0);
if(g_bWorldCreated){
dJointGroupDestroy(g_dContactGroupID);
dSpaceDestroy(g_dSpace);
dWorldDestroy(g_dWorld);
}
g_dWorld = dWorldCreate();
g_dSpace = dHashSpaceCreate(0);
g_dContactGroupID = dJointGroupCreate(0);
dWorldSetContactMaxCorrectingVel(g_dWorld, 0.1);
g_bWorldCreated = true;
}
}}
Gravity = (0, 0, 0)
LinearDamping = 0
AngularDamping = 0
ContactSurfaceLayer = 0
AutoDisableFlag = 0
#code(C){{
void CleanODE(void)
{
if(g_bWorldCreated){
for(int i = 0; i < (int)g_vRObjs.size(); ++i){
dBodyDestroy(g_vRObjs[i]);
}
dGeomDestroy(g_dGround);
dJointGroupDestroy(g_dContactGroupID);
dSpaceDestroy(g_dSpace);
dWorldDestroy(g_dWorld);
dCloseODE();
}
}
}}
#code(C){{
dBodyID SetODECube(Vec3 pos, double len)
{
dMass mass;
dMassSetBox(&mass, 1.0, (dReal)len, (dReal)len, (dReal)l...
dMassAdjust(&mass, 1.0);
dGeomID geom = dCreateBox(g_dSpace, (dReal)len, (dReal)l...
dBodyID body = dBodyCreate(g_dWorld);
dBodySetMass(body, &mass);
dGeomSetBody(geom, body);
dBodySetPosition(body, pos[0], pos[1], pos[2]);
return body;
}
}}
#code(C){{
void StepODE(void)
{
NearCallData data;
data.world = &g_dWorld;
data.contact = &g_dContactGroupID;
dSpaceCollide(g_dSpace, &data, &ODENearCallback);
dWorldQuickStep(g_dWorld, g_fDt);
dJointGroupEmpty(g_dContactGroupID);
}
}}
#code(C){{
struct NearCallData
{
dWorldID* world;
dJointGroupID* contact;
};
/*!
* @param[in] data
*/
static void ODENearCallback(void *data, dGeomID o1, dGeom...
{
dBodyID b1 = dGeomGetBody(o1);
dBodyID b2 = dGeomGetBody(o2);
if(b1 && b2 && dAreConnected(b1, b2)){
return;
}
dContact contact[RX_MAX_CONTACTS];
int n = dCollide(o1, o2, RX_MAX_CONTACTS, &contact[0].ge...
for(int i = 0; i < n; ++i){
contact[i].surface.mode = dContactBounce | dContactSli...
contact[i].surface.bounce_vel = 0.001;
contact[i].surface.slip1 = 0.0;
contact[i].surface.slip2 = 0.0;
// contact[i].surface.soft_erp = 0.1;
// contact[i].surface.soft_cfm = 0.01;
dJointID c = dJointCreateContact(*(((NearCallData*)dat...
dJointAttach(c, dGeomGetBody(o1), dGeomGetBody(o2));
}
}
}
}}
#code(C){{
void DrawODEBody(dBodyID body)
{
glPushMatrix();
Vec3 pos;
GLfloat m[16];
pos = ODE_GetPosition(body);
GetRotationMatrix(body, m);
glTranslatef(pos[0], pos[1], pos[2]);
glMultMatrixf(m);
dGeomID geom = dBodyGetFirstGeom(body);
int type = dGeomGetClass(geom);
if(type == dBoxClass){
dReal sl[4];
dGeomBoxGetLengths(geom, sl);
glScalef(sl[0], sl[1], sl[2]);
glutSolidCube(1.0);
}
else if(type == dSphereClass){
dReal rad = dGeomSphereGetRadius(geom);
glutSolidSphere(rad, 32, 16);
}
else if(type == dCapsuleClass){
dReal rad, len;
dGeomCapsuleGetParams(geom, &rad, &len);
DrawCapsule(rad, len, 20);
}
else if(type == dCylinderClass){
dReal rad, len;
dGeomCylinderGetParams(geom, &rad, &len);
DrawCylinder(rad, len, 20);
}
glPopMatrix();
}
}}
| m[0] m[1] m[2] m[3] |
| m[4] m[5] m[6] m[7] |
| m[8] m[9] m[10] m[11] |
| m[0] m[4] m[8] m[12] |
| m[1] m[5] m[9] m[13] |
| m[2] m[6] m[10] m[14] |
| m[3] m[7] m[11] m[15] |
#code(C){{
void GetRotationMatrix(dBodyID body, GLfloat m[16])
{
m[0] = dBodyGetRotation(body)[0];
m[1] = dBodyGetRotation(body)[4];
m[2] = dBodyGetRotation(body)[8];
m[3] = 0.0f;
m[4] = dBodyGetRotation(body)[1];
m[5] = dBodyGetRotation(body)[5];
m[6] = dBodyGetRotation(body)[9];
m[7] = 0.0f;
m[8] = dBodyGetRotation(body)[2];
m[9] = dBodyGetRotation(body)[6];
m[10] = dBodyGetRotation(body)[10];
m[11] = 0.0f;
m[12] = dBodyGetRotation(body)[3];
m[13] = dBodyGetRotation(body)[7];
m[14] = dBodyGetRotation(body)[11];
m[15] = 1.0f;
}
}}
dGeomID dCreateSphere(dSpaceID space, dReal radius);
void dBodySetPosition(dBodyID, dReal x, dReal y, dReal z);
void dBodySetRotation(dBodyID, const dMatrix3 R);
void dBodySetQuaternion dBodyID, const dQuaternion q);
void dBodySetLinearVel(dBodyID, dReal x, dReal y, dReal ...
void dBodySetAngularVel(dBodyID, dReal x, dReal y, dReal...
void dGeomSphereSetRadius(dGeomID sphere, dReal radius);
dReal dGeomSphereGetRadius(dGeomID sphere);
dReal dGeomSpherePointDepth(dGeomID sphere, dReal x, dRe...
dGeomID dCreateBox(dSpaceID space, dReal lx, dReal ly, d...
dGeomID dCreatePlane(dSpaceID space, dReal a, dReal b, d...
dGeomID dCreateCylinder(dSpaceID space, dReal radius, dR...
void dGeomCylinderSetParams(dGeomID cylinder, dReal radi...
void dGeomCylinderGetParams(dGeomID cylinder, dReal *rad...
dGeomID dCreateCapsule(dSpaceID space, dReal radius, dRe...
#define dCreateCCylinder dCreateCapsule
void dMassSetCappedCylinder(dMass *, dReal density, int ...
void dMassSetCappedCylinderTotal(dMass *, dReal total_ma...
dGeomID dCreateRay(dSpaceID space, dReal length);
dGeomID dCreateTriMesh(dSpaceID space, dTriMeshDataID Da...
dTriCallback *Callback,
dTriArrayCallback * ArrayCallback,
dTriRayCallback* RayCallback);
dTriMeshDataID dGeomTriMeshDataCreate();
void dGeomTriMeshDataBuild(dTriMeshDataID g, const void*...
int VertexStride, int VertexC...
const void* Indices, int IndexCount,
int TriStride, const void* No...
const dReal* dBodyGetPosition(dBodyID);
const dReal* dBodyGetRotation(dBodyID);
const dReal* dBodyGetQuaternion(dBodyID);
-&ref(box.zip);
-[[Open Dynamics Engine v0.5 User Guide:http://ode.org/od...
-[[ODE Wiki:http://opende.sf.net/wiki]]
終了行:
----
#contents
----
#include(build_ode,notitle)
#code(C){{
bool g_bWorldCreated = false;
void InitODE(void)
{
dInitODE2(0);
if(g_bWorldCreated){
dJointGroupDestroy(g_dContactGroupID);
dSpaceDestroy(g_dSpace);
dWorldDestroy(g_dWorld);
}
g_dWorld = dWorldCreate();
g_dSpace = dHashSpaceCreate(0);
g_dContactGroupID = dJointGroupCreate(0);
dWorldSetContactMaxCorrectingVel(g_dWorld, 0.1);
g_bWorldCreated = true;
}
}}
Gravity = (0, 0, 0)
LinearDamping = 0
AngularDamping = 0
ContactSurfaceLayer = 0
AutoDisableFlag = 0
#code(C){{
void CleanODE(void)
{
if(g_bWorldCreated){
for(int i = 0; i < (int)g_vRObjs.size(); ++i){
dBodyDestroy(g_vRObjs[i]);
}
dGeomDestroy(g_dGround);
dJointGroupDestroy(g_dContactGroupID);
dSpaceDestroy(g_dSpace);
dWorldDestroy(g_dWorld);
dCloseODE();
}
}
}}
#code(C){{
dBodyID SetODECube(Vec3 pos, double len)
{
dMass mass;
dMassSetBox(&mass, 1.0, (dReal)len, (dReal)len, (dReal)l...
dMassAdjust(&mass, 1.0);
dGeomID geom = dCreateBox(g_dSpace, (dReal)len, (dReal)l...
dBodyID body = dBodyCreate(g_dWorld);
dBodySetMass(body, &mass);
dGeomSetBody(geom, body);
dBodySetPosition(body, pos[0], pos[1], pos[2]);
return body;
}
}}
#code(C){{
void StepODE(void)
{
NearCallData data;
data.world = &g_dWorld;
data.contact = &g_dContactGroupID;
dSpaceCollide(g_dSpace, &data, &ODENearCallback);
dWorldQuickStep(g_dWorld, g_fDt);
dJointGroupEmpty(g_dContactGroupID);
}
}}
#code(C){{
struct NearCallData
{
dWorldID* world;
dJointGroupID* contact;
};
/*!
* @param[in] data
*/
static void ODENearCallback(void *data, dGeomID o1, dGeom...
{
dBodyID b1 = dGeomGetBody(o1);
dBodyID b2 = dGeomGetBody(o2);
if(b1 && b2 && dAreConnected(b1, b2)){
return;
}
dContact contact[RX_MAX_CONTACTS];
int n = dCollide(o1, o2, RX_MAX_CONTACTS, &contact[0].ge...
for(int i = 0; i < n; ++i){
contact[i].surface.mode = dContactBounce | dContactSli...
contact[i].surface.bounce_vel = 0.001;
contact[i].surface.slip1 = 0.0;
contact[i].surface.slip2 = 0.0;
// contact[i].surface.soft_erp = 0.1;
// contact[i].surface.soft_cfm = 0.01;
dJointID c = dJointCreateContact(*(((NearCallData*)dat...
dJointAttach(c, dGeomGetBody(o1), dGeomGetBody(o2));
}
}
}
}}
#code(C){{
void DrawODEBody(dBodyID body)
{
glPushMatrix();
Vec3 pos;
GLfloat m[16];
pos = ODE_GetPosition(body);
GetRotationMatrix(body, m);
glTranslatef(pos[0], pos[1], pos[2]);
glMultMatrixf(m);
dGeomID geom = dBodyGetFirstGeom(body);
int type = dGeomGetClass(geom);
if(type == dBoxClass){
dReal sl[4];
dGeomBoxGetLengths(geom, sl);
glScalef(sl[0], sl[1], sl[2]);
glutSolidCube(1.0);
}
else if(type == dSphereClass){
dReal rad = dGeomSphereGetRadius(geom);
glutSolidSphere(rad, 32, 16);
}
else if(type == dCapsuleClass){
dReal rad, len;
dGeomCapsuleGetParams(geom, &rad, &len);
DrawCapsule(rad, len, 20);
}
else if(type == dCylinderClass){
dReal rad, len;
dGeomCylinderGetParams(geom, &rad, &len);
DrawCylinder(rad, len, 20);
}
glPopMatrix();
}
}}
| m[0] m[1] m[2] m[3] |
| m[4] m[5] m[6] m[7] |
| m[8] m[9] m[10] m[11] |
| m[0] m[4] m[8] m[12] |
| m[1] m[5] m[9] m[13] |
| m[2] m[6] m[10] m[14] |
| m[3] m[7] m[11] m[15] |
#code(C){{
void GetRotationMatrix(dBodyID body, GLfloat m[16])
{
m[0] = dBodyGetRotation(body)[0];
m[1] = dBodyGetRotation(body)[4];
m[2] = dBodyGetRotation(body)[8];
m[3] = 0.0f;
m[4] = dBodyGetRotation(body)[1];
m[5] = dBodyGetRotation(body)[5];
m[6] = dBodyGetRotation(body)[9];
m[7] = 0.0f;
m[8] = dBodyGetRotation(body)[2];
m[9] = dBodyGetRotation(body)[6];
m[10] = dBodyGetRotation(body)[10];
m[11] = 0.0f;
m[12] = dBodyGetRotation(body)[3];
m[13] = dBodyGetRotation(body)[7];
m[14] = dBodyGetRotation(body)[11];
m[15] = 1.0f;
}
}}
dGeomID dCreateSphere(dSpaceID space, dReal radius);
void dBodySetPosition(dBodyID, dReal x, dReal y, dReal z);
void dBodySetRotation(dBodyID, const dMatrix3 R);
void dBodySetQuaternion dBodyID, const dQuaternion q);
void dBodySetLinearVel(dBodyID, dReal x, dReal y, dReal ...
void dBodySetAngularVel(dBodyID, dReal x, dReal y, dReal...
void dGeomSphereSetRadius(dGeomID sphere, dReal radius);
dReal dGeomSphereGetRadius(dGeomID sphere);
dReal dGeomSpherePointDepth(dGeomID sphere, dReal x, dRe...
dGeomID dCreateBox(dSpaceID space, dReal lx, dReal ly, d...
dGeomID dCreatePlane(dSpaceID space, dReal a, dReal b, d...
dGeomID dCreateCylinder(dSpaceID space, dReal radius, dR...
void dGeomCylinderSetParams(dGeomID cylinder, dReal radi...
void dGeomCylinderGetParams(dGeomID cylinder, dReal *rad...
dGeomID dCreateCapsule(dSpaceID space, dReal radius, dRe...
#define dCreateCCylinder dCreateCapsule
void dMassSetCappedCylinder(dMass *, dReal density, int ...
void dMassSetCappedCylinderTotal(dMass *, dReal total_ma...
dGeomID dCreateRay(dSpaceID space, dReal length);
dGeomID dCreateTriMesh(dSpaceID space, dTriMeshDataID Da...
dTriCallback *Callback,
dTriArrayCallback * ArrayCallback,
dTriRayCallback* RayCallback);
dTriMeshDataID dGeomTriMeshDataCreate();
void dGeomTriMeshDataBuild(dTriMeshDataID g, const void*...
int VertexStride, int VertexC...
const void* Indices, int IndexCount,
int TriStride, const void* No...
const dReal* dBodyGetPosition(dBodyID);
const dReal* dBodyGetRotation(dBodyID);
const dReal* dBodyGetQuaternion(dBodyID);
-&ref(box.zip);
-[[Open Dynamics Engine v0.5 User Guide:http://ode.org/od...
-[[ODE Wiki:http://opende.sf.net/wiki]]
ページ名: