zoukankan      html  css  js  c++  java
  • OGRE 第一个程序

    OGRE 第一个程序

    江西理工 FangSH 2010109日星期六

     

    关于VS2005的搭建。我自己的经验。编译时出现了什么错误就加什么。所以最后所有需要的头文件和库文件如下:

    包含文件:

    Samples\Common\include

    Include

    OgreMain\include

    Dependencies\include

    Dependencies\src\ois-1.2.0\include

    库文件 :

    lib\debug

    bin\debug

    lib\release

    bin\release

    Dependencise\lib\Debug

    Dependencies\lib\Release

     

     

    当然这之前是要先在VS2005配置好DirectX9.0的。

     大致的框架:

     

    int APIENTRY _tWinMain(HINSTANCE hInstance,

    HINSTANCE hPrevInstance,

    LPTSTR lpCmdLine,

    int nCmdShow)

    {

    BasicTutorial2 app;
    //<----这是我们要做的事!

    try

    {

    app.go();

    }

    catch (Ogre::Exception &e)

    {

    ::MessageBox(NULL, e.getFullDescription().c_str(),
    "An exception has occured!",

    MB_OK
    | MB_ICONERROR | MB_TASKMODAL);

    }

    return0;

    }

     

     我们要做的就是写一个BasicTutorial2了。

    第三BasicTutorial2类

     

    #pragma once

    #include
    "resource.h"

    #include
    "ExampleApplication.h"



    class BasicTutorial2 : public ExampleApplication

    {

    public:

    BasicTutorial2(
    void);

    virtual~BasicTutorial2(void);

    protected:

    virtualvoid createScene(void);

    virtualvoid createCamera(void);

    virtualvoid createViewports(void);

    };

     

     

    说明:

    1 这个类主要是三个函数createCamera()createScene() createViewports();

    2 ExampleApplication 这个类在ExampleApplication.h中, 而ExampleApplication.h在Samples\Common\include中。

     

    void BasicTutorial2::createCamera(void)

    {

    // 创建一个摄像机

    mCamera
    = mSceneMgr->createCamera("PlayerCam");

    // 设置摄像机的位置和方向

    mCamera
    ->setPosition(Ogre::Vector3(0, 10, 500));

    mCamera
    ->lookAt(Ogre::Vector3(0, 0, 0));

    // 近距离裁剪

    mCamera
    ->setNearClipDistance(5);

    }

     

     

     

    说明:由mSceneMgr创建。因为它是场景管理对象。OGRE的基石——实体,场景节点,场景管理器

     

    void BasicTutorial2::createViewports(void)

    {

    // 创建一个视口并加入到窗口中

    Ogre::Viewport
    * vp = mWindow->addViewport(mCamera);

    // 设置背景颜色

    vp
    ->setBackgroundColour(Ogre::ColourValue(0.2, 0.1, 1));

    // 设置纵宽比

    mCamera
    ->setAspectRatio(Ogre::Real(vp->getActualWidth())/

    Ogre::Real(vp
    ->getActualHeight()));

    }

     

     

    说明 :

    什么是视口:你必须告诉渲染窗口哪些摄像机去呈现场景,哪部分窗口被渲染进来。你告诉渲染窗口的摄像机所呈现的区域就是视口,并且这里只有一个视口实体。

    2 建立视口的方法通常是简单的调用渲染窗口中addViewport函数,把她提供给正在使用的摄像机。

     

     

    void BasicTutorial2::createScene(void)

    {

    mSceneMgr
    ->setAmbientLight(Ogre::ColourValue(0, 0, 0));

    // 设置加成模板阴影

    mSceneMgr
    ->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);

    // 人物加载进来

    Ogre::Entity
    * entNinja = mSceneMgr->createEntity("Ninja", "ninja.mesh");

    // 投射阴影

    entNinja
    ->setCastShadows(true);



    // 将实体与场景节点绑定在一起

    mSceneMgr
    ->getRootSceneNode()->createChildSceneNode()->attachObject(entNinja);



    // 定义一个平面

    Ogre::Plane plane(Ogre::Vector3::UNIT_Y,
    0);



    // 创建一个平面

    Ogre::MeshManager::getSingleton().createPlane(
    "ground",

    ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,

    1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);



    // 创建场景结点并将实体与场景节点绑定在一起

    Ogre::Entity
    * entGround = mSceneMgr->createEntity("GroundEntity", "ground");

    mSceneMgr
    ->getRootSceneNode()->createChildSceneNode()->attachObject(entGround);



    // 贴纹理

    entGround
    ->setMaterialName("Examples/Rockwall");

    entGround
    ->setCastShadows(false);



    // 点光源设置

    Ogre::Light
    * pointLight = mSceneMgr->createLight("pointLight");

    pointLight
    ->setType(Ogre::Light::LT_POINT);

    pointLight
    ->setPosition(Ogre::Vector3(0, 150, 250));

    pointLight
    ->setDiffuseColour(1.0, 0.0, 0.0);

    pointLight
    ->setSpecularColour(1.0, 0.0, 0.0);



    // 有向光设置

    Ogre::Light
    * directionalLight = mSceneMgr->createLight("directionalLight");

    directionalLight
    ->setType(Ogre::Light::LT_DIRECTIONAL);

    directionalLight
    ->setDiffuseColour(Ogre::ColourValue(.25, .25, 0));

    directionalLight
    ->setSpecularColour(Ogre::ColourValue(.25, .25, 0));

    directionalLight
    ->setDirection(Ogre::Vector3( 0, -1, 1 ));



    // 聚光源设置

    Ogre::Light
    * spotLight = mSceneMgr->createLight("spotLight");

    spotLight
    ->setType(Ogre::Light::LT_SPOTLIGHT);

    spotLight
    ->setDiffuseColour(0, 0, 1.0);

    spotLight
    ->setSpecularColour(0, 0, 1.0);

    spotLight
    ->setDirection(-1, -1, 0);



    // 设置位置和方向来确定聚光源

    spotLight
    ->setPosition(Ogre::Vector3(300, 300, 0));

    spotLight
    ->setSpotlightRange(Ogre::Degree(35), Ogre::Degree(50));

    }

     

     

    说明:

    1 ogre目前支持3种类型的阴影:

    调制纹理阴影 (SHADOWTYPE_TEXTURE_MODULATIVE) 

    调制模板阴影 (SHADOWTYPE_STENCIL_MODULATIVE)

    加成模板阴影 (SHADOWTYPE_STENCIL_ADDITIVE)

    2 用阴影在Ogre中相对来说是比较简单的。SceneManager类中有一个setShadowTechnique成员函数,我们可以使用她设置我们想要的阴影类型。这样只要你创建了一个实体,调用setCastShadows方法来设置这个实体是否投射阴影。

    3 光源种类

    点光源 (LT_POINT) - 从一个点发出光放射到四周。 

    聚光源 (LT_SPOTLIGHT) - 严格来说聚光灯工作有点像手电筒。 你在某个地方设置了灯光的起点,然后灯光射向一个方向。你可以告诉光源内锥角度大小和外锥角度大小(你知道手电筒内部会明亮一些。) 

    有向光 (LT_DIRECTIONAL) - 有向光模拟非常遥远地方的灯光,在场景中从某个方向照射物体。如果你想要一个夜晚的场景你就需要模拟月光。你可以通过为场景设置环境光来做到这个,但是这并非是真实场景的模拟因为月光并不平等地照亮所有物体(日光也不是)。一种方法解决这个是设置一个有向的光源然后指向一个方向,月光就会显示出来。

     

    程序控制: 用键盘上WASD来移动,用鼠标观察四周。Ese键退出(OGRE框架默认的)

    程序截屏:

     

    --end

     

     

     

     

  • 相关阅读:
    2、selinux服务的操作
    1、添加nginx到全局变量中
    linux每日命令(1):which
    QT重载基类绘制函数并在基类绘制结果基础上进行子类的绘制
    QT信号槽无法正常通信的原因
    mapgis6.7+加密狗+二次开发SDK库
    KMP算法参考及C语言实现
    elastic search
    RabbitMq docker集群
    RabbitMq安装
  • 原文地址:https://www.cnblogs.com/fangshenghui/p/1846756.html
Copyright © 2011-2022 走看看