|
盖莫游戏引擎2.1.1的地形小例
代码如下:
#include <GEngine/Gaimo.hpp>
using namespace std;
using namespace core;
void RotateView(float angle, float x, float y, float z);
//! 处理键盘响应
void KeyCheck(RefPtr<Input> input);
RefPtr<Camera> camera;
RefPtr<Text> font;
char textbuf[20]="";
float yrot=0.0f;
float dv=0.0f;
int Main()
{
//! 初始化引擎设备并得到设备指针
RefPtr<Device> device = InitDevice("地形测试");
//! 得到引擎场景指针
RefPtr<SceneManager> scenemanager = device->GetSceneManager();
//! 得到引擎资源指针
RefPtr<ResourceManager> resourcemanager = device->GetResourceManager();
//! 获取图形管理器指针
RefPtr<ImageManager> imagemanager = resourcemanager->GetImageManager();
//! 得到视频驱动器指针
RefPtr<VideoDriver> videodriver = device->GetVideoDriver();
font= resourcemanager->GetTextManager()->CreateText("heiti","黑体",16);
//! 得到地形
RefPtr<Terrain> terrain = scenemanager->GetTerrain();
//! 载入高程图
terrain->LoadHeightMap("..\\terrain\\terrain.raw",1024,16);
//! 获取地形图形指针
RefPtr<Image> mainimage = imagemanager->CreateObject("mainimage", "..\\terrain\\terrain.bmp");
RefPtr<Image> detailimage = imagemanager->CreateObject("detailimage","..\\terrain\\detail.bmp");
//! 获取纹理管理器
RefPtr<TextureManager> texturemanager = resourcemanager->GetTextureManager();
//! 获取纹理指针
RefPtr<Texture> maintexture = texturemanager->CreateTexture("maintex",mainimage);
RefPtr<Texture> detailtexture = texturemanager->CreateTexture("detailtex",detailimage);
terrain->LoadTexture(maintexture,detailtexture);
//! 获取摄像机指针
camera = scenemanager->GetCameraManager()->CreateCamera("camera",Vector3f(300,10,300),
Vector3f(10,10,0));
camera->SetViewPort(Recti(0,0,640,480));
camera->SetPerspective(45.0f,640.0f/480.0f,0.1f,600.0f);
device->GetVideoDriver()->EnableCulling();
//! 获取雾指针
RefPtr<Fog> fog = resourcemanager->GetFog("..\\script//fog.lua","fog");
fog->Render();
Vector3f camera_pos,camera_view;
BEGIN_LOOP(device)
videodriver->SetClearBuffer(ENGINE_CLEAR_COLOR | ENGINE_CLEAR_DEPTH);
camera->Render();
terrain->Render();
KeyCheck(device->GetInput());
camera_pos = camera->GetPosition();
sprintf(textbuf,"camerapos %f,%f,%f)",camera_pos.x,camera_pos.y,camera_pos.z);
font->Render(10,15,textbuf);
camera_view = camera->GetView();
sprintf(textbuf,"cameraview:(%f,%f,%f)",camera_view.x,camera_view.y,camera_view.z);
font->Render(10,35,textbuf);
RotateView(yrot,0.0f,1.0f,0.0f);
camera->MoveCamera(dv);
sprintf(textbuf,"nowheight:%f",terrain->GetAveHeight(camera_pos.x,camera_pos.z));
font->Render(10,55,textbuf);
camera_pos = camera->GetPosition();
camera->SetPosition(Vector3f(camera_pos.x,terrain->GetAveHeight(camera_pos.x,camera_pos.z)+30,camera_pos.z));
//! 保持视线水平
camera_view = camera->GetView();
camera->SetView(Vector3f(camera_view.x,terrain->GetAveHeight(camera_pos.x,camera_pos.z)+30,camera_view.z));
dv = 0;
END_LOOP(device)
return 0;
}
void RotateView(float angle, float x, float y, float z)
{
Vector3f view;
Vector3f camera_pos,camera_view;
camera_pos = camera->GetPosition();
camera_view = camera->GetView();
Vector3f vView = camera_view - camera_pos;
float cosTheta = (float)cos(angle);
float sinTheta = (float)sin(angle);
vView.x = (cosTheta + (1 - cosTheta) * x * x) * vView.x;
view.x += ((1 - cosTheta) * x * y - z * sinTheta) * vView.y;
view.x += ((1 - cosTheta) * x * z + y * sinTheta) * vView.z;
view.y = ((1 - cosTheta) * x * y + z * sinTheta) * vView.x;
view.y += (cosTheta + (1 - cosTheta) * y * y) * vView.y;
view.y += ((1 - cosTheta) * y * z - x * sinTheta) * vView.z;
view.z = ((1 - cosTheta) * x * z - y * sinTheta) * vView.x;
view.z += ((1 - cosTheta) * y * z + x * sinTheta) * vView.y;
view.z += (cosTheta + (1 - cosTheta) * z * z) * vView.z;
camera_view = camera_pos + view;
camera->SetView(camera_view);
}
//! 处理键盘响应
void KeyCheck(RefPtr<Input> input)
{
if(input->IsPressedKey(KEY_UP))
{
dv=5.0f;
return;
}
else if(input->IsPressedKey(KEY_DOWN))
{
dv=-5.0f;
return;
}
else if(input->IsPressedKey(KEY_LEFT))
{
yrot=0.05f;
return;
}
else if(input->IsPressedKey(KEY_RIGHT))
{
yrot=-0.05f;
return;
}
else if(input->IsPressedKey(KEY_SPACE))
{
dv=0.0f;
return;
}
}
 |
|