|
当前引擎只是简单的封装了ode几个函数而已
更多的工作需要以后慢慢加入之
这个demo的含义是物理对象在物理场景中会是到重力的作用,如果没有支持物的话会向下掉
下面这是实现的代码-为了贴图我把重力加速度设置的很小(-0.0098f)
//! 2010.03.03
/////////////////////////////////////////////////////
/// 盖莫游戏引擎的物理引擎测试1
/////////////////////////////////////////////////////
#include <GEngine/Gaimo.hpp>
core:hysicsEngine<dWorldID,dSpaceID,dJointGroupID,dGeomID> engine;
core::PhysicsBody<dBodyID,dGeomID,1> object;
//! 盒子表面纹理
int id;
//! 盒子初始高度
float init_box_height = 600;
//! 检测碰撞回调函数
static void nearCallback(void *data, dGeomID o1, dGeomID o2)
{
int i;
dBodyID b1 = dGeomGetBody(o1);
dBodyID b2 = dGeomGetBody(o2);
//! 最大接触点4个
dContact contact[4];
for (i = 0; i < 4; i++)
{
contact.surface.mode = dContactBounce | dContactSoftCFM;
contact.surface.mu = dInfinity;
contact.surface.mu2 = 0;
contact.surface.bounce = 0.01;
contact.surface.bounce_vel = 0.1;
contact.surface.soft_cfm = 0.01;
}
if (int numc = dCollide(o1, o2, 4, &contact[0].geom, sizeof(dContact)))
{
for (i = 0; i < numc; i++)
{
dJointID c = dJointCreateContact(engine.GetWorld(), engine.GetContactGroup(), contact + i);
dJointAttach(c, b1, b2);
}
}
}
void SimLoop();
int main(int argc, char **argv)
{
//! 初始化引擎设备并得到设备指针
core:evice* device = core::InitDevice("盖莫引擎物理场景测试1");
//! 得到引擎场景指针
core::RefPtr<core::SceneManager> scenemanager = device->GetSceneManager();
//! 得到引擎资源指针
core::ResourceManager* resourcemanager = device->GetResourceManager();
//! 获取lua指针
LuaPlus:uaStateOwner *lua = device->GetLuaStateOwner();
//! 载入lua脚本
(*lua)->DoFile("..\\script//skybox.lua");
//! 获取天空盒表对象
LuaPlus::LuaObject skyboxtable = (*lua)->GetGlobal("skybox");
//! 得到天空盒图形和其纹理
core::RefPtr<core::Image> skyimage0 = resourcemanager->GetImage("sky1",skyboxtable["front"].GetString());
core::RefPtr<core::Image> skyimage1 = resourcemanager->GetImage("sky2",skyboxtable["back"].GetString());
core::RefPtr<core::Image> skyimage2 = resourcemanager->GetImage("sky3",skyboxtable["left"].GetString());
core::RefPtr<core::Image> skyimage3 = resourcemanager->GetImage("sky4",skyboxtable["right"].GetString());
core::RefPtr<core::Image> skyimage4 = resourcemanager->GetImage("sky5",skyboxtable["top"].GetString());
core::RefPtr<core::Texture> sky0 = resourcemanager->GetTexture("front",skyimage0);
core::RefPtr<core::Texture> sky1 = resourcemanager->GetTexture("back",skyimage1);
core::RefPtr<core::Texture> sky2 = resourcemanager->GetTexture("left",skyimage2);
core::RefPtr<core::Texture> sky3 = resourcemanager->GetTexture("right",skyimage3);
core::RefPtr<core::Texture> sky4 = resourcemanager->GetTexture("top",skyimage4);
//! 得到天空盒指针
core::RefPtr<core::Renderable> skybox = scenemanager->GetSkyBox(sky0,sky1,sky2,sky3,sky4,
skyboxtable["width"].GetFloat(),
skyboxtable["length"].GetFloat(),
skyboxtable["heigth"].GetFloat()
,skyboxtable["rotstep"].GetFloat());
//! 载入lua脚本
(*lua)->DoFile("..\\script//terrain.lua");
//! 获取地形表对象
LuaPlus::LuaObject terraintable = (*lua)->GetGlobal("terrain");
//! 得到地形图形和其纹理
core::RefPtr<core::Image> terrainimage0 = resourcemanager->GetImage("terrain0",terraintable["image1"].GetString());
core::RefPtr<core::Image> terrainimage1 = resourcemanager->GetImage("terrain1",terraintable["image2"].GetString());
core::RefPtr<core::Texture> terraintexture0 = resourcemanager->GetTexture("terraim0",terrainimage0);
core::RefPtr<core::Texture> terraintexture1 = resourcemanager->GetTexture("terraim1",terrainimage1);
//! 获取盒子图形和纹理
core::RefPtr<core::Image> logoimage = resourcemanager->GetImage("logo","..\\image//logo.jpg");
core::RefPtr<core::Texture> logo = resourcemanager->GetTexture("logo",logoimage);
logo->Bind();
id = logo->GetTextureId();
//! 创建地形描述符
core::TerrainDesc desc;
desc.main_texture = terraintexture0;
desc.detail_texture = terraintexture1;
desc.use_detail = terraintable["usedetail"].GetInteger();
//! 获取地形指针
core::RefPtr<core::Terrain> terrain = scenemanager->GetTerrain(desc);
terrain->LoadHeigthMap(terraintable["rawfile"].GetString(),terraintable["mapsize"].GetInteger(),terraintable["cell"].GetInteger());
//! 获取全局摄像机
core::RefPtr<core::Camera> camera = scenemanager->GetGlobalCamera(Vector3f(230,terrain->GetHeight(220,215)+10,245),
Vector3f(251,terrain->GetHeight(251,216)+10,216),
Vector3f(0,1,0));
camera->SetViewport(0,0,640,480);
camera->SetPerspective(50.0f,640.0f/480.0f,0.1f,1000.0f);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
//! 获取雾指针
core::RefPtr<core::Fog> fog = scenemanager->GetFog();
//! 载入lua脚本
(*lua)->DoFile("..\\script//fog.lua");
//! 获取雾表对象
LuaPlus::LuaObject fogtable = (*lua)->GetGlobal("fog");
fog->SetDensity(fogtable["density"].GetFloat());
fog->SetBound(fogtable["near"].GetFloat(),fogtable["far"].GetFloat());
fog->SetQuality(fogtable["quality"].GetFloat());
fog->SetColor(core::Color(fogtable["red"].GetFloat(),
fogtable["green"].GetFloat(),
fogtable["blue"].GetFloat(),
fogtable["alpha"].GetFloat()));
fog->Render();
float sides[] = {2,2,2};
float pos[] = {251,init_box_height,216};
//! 设置空间重力加速度
engine.SetGravity(0,-0.0098,0);
//! 设置空间平面
engine.SetPlane(0,1,0,terrain->GetHeight(251,216)+10);
//! 加载碰撞检测回调函数
engine.SetCollideCallBack(&nearCallback);
dMass m;
object.body = dBodyCreate(engine.GetWorld());
sides[0] = 2.0;
sides[1] = 2.0;
sides[2] = 2.0;
dMatrix3 mat;
dBodySetPosition(object.body,251,terrain->GetHeight(251,216)+20,216);
dBodySetLinearVel(object.body,0,0,0);
dRFromAxisAndAngle(mat, dRandReal() * 2.0 - 1.0, dRandReal() * 2.0 - 1.0, dRandReal() * 2.0 - 1.0, dRandReal() * 10.0 - 5.0);
dBodySetRotation(object.body, mat);
dMassSetBox(&m,0.5, sides[0], sides[1], sides[2]);
object.geom[0] = dCreateBox(engine.GetSpace(), sides[0], sides[1], sides[2]);
dGeomSetBody(object.geom[0], object.body);
dBodySetMass(object.body, &m);
BEGIN_LOOP(device)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
camera->SetPerspective(45.0f,640.0f/480.0f,0.1f,1000.0f);
camera->Render();
skybox->Render();
terrain->Render();
SimLoop();
END_LOOP(device)
device->Close();
device->Drop();
return 0;
}
void SimLoop()
{
engine.Simulation();
dReal sides[3];
const dReal *pos;
const dReal *mat;
dGeomBoxGetLengths(object.geom[0], sides);
float dsides[] = {sides[0],sides[1],sides[2]};
pos = dGeomGetPosition(object.geom[0]);
float dpos[] = {pos[0],pos[1],pos[2]};
mat = dGeomGetRotation(object.geom[0]);
float dmat[] = {mat[0],mat[1],mat[2], mat[3],
mat[4],mat[5],mat[6], mat[7],
mat[8],mat[9],mat[10],mat[11]};
core::Render::RenderCube(id,dpos,dmat,dsides);
}
显示如下:
|
|