| 
 | 
 
 
盖莫游戏引擎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; 
    } 
} 
 
  |   
 
 
 
 |