游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2085|回复: 0

盖莫游戏引擎2.1.1的地形小例

[复制链接]

50

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2010-4-9 15:07:00 | 显示全部楼层 |阅读模式

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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-1 19:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表