【TomoEngine】 第一讲 太空遨游(一) 创建太阳系

来源:互联网 发布:数据库三大范式好处 编辑:程序博客网 时间:2024/03/29 23:26

    TomoEngine是一款自主研发的商业轻量级跨平台3D实时图形渲染引擎,目前还处于初级阶段,有很多功能还在持续完善的过程中。随着对TomoEngine的博文更新,本博客迎来了全新的阶段。博主日后将会用大量时间来介绍这一款3D引擎的使用,读者朋友可以当成一个学习的工具。

          TomoEngine官方qq群:591080786  欢迎到群内讨论TomoEngine问题

      示例工程的百度云下载地址:TomoEngine-Library&Sample。作为商业引擎,TomoEngine短期内并不会开源。TomoEngine的引擎库Library文件以及SDK Specification Document是可以免费获取的,对于喜欢图形编程的读者,这将会是一款适合学习的工具。

     环境要求:

         1. 安装 DirectX SDK 

         2. 切换电脑显卡为独立显卡以支持OpenGL 3.x以上版本

               在 设备管理器 中,选择 显示适配器 ,选中指定选项 右键 启用

            

         3. 安装vs2013以上版本


     第一个用TomoEngine制作的Demo-SpaceCraft(太空遨游)

       效果图:

          




     工程文件(vs2013)详解 ,后续会逐步实现上面的场景,

              这一讲暂时只建立宇宙空间以及太阳和金星

           main.cpp - 建立太空遨游App的框架类App3DSpaceTravel

#include "App3DSpaceTravel.h"void main(){App3DFramework* app = new App3DSpaceTravel;app->go();delete app;}

         Step01 - initialize resource 初始化加载资源

                  InitialiseResourceGroup() - 初始化资源组Popular文件资源

void App3DSpaceTravel::LoadRes(){LOGINFO("load_res thread begin");ResourceGroupManager::GetSingleton().InitialiseResourceGroup("Popular");SetupSolarSystem();SetupEarthScene();LOGINFO("load_res thread end");}

         Step02 - create scene 创建场景

               首先获取当前的场景管理器SceneManager,

                   创建当前场景的主摄像机CreateCamera,创建相机对应的SceneNode节点

                    并设置为当前摄像机,挂接到camNode上,

                    给当前视口ActiveViewport添加当前摄像机pMainCamera

               

                  SetupSolarSystem() - 建立太阳系场景内容

                  SetupEarthScene() - 建立星空

void App3DSpaceTravel::CreateSpaceScene(Tomo::SceneTypeMask typeMask, const string& InstanceName){SceneManager* sm = m_pRoot->CreateSceneManager(typeMask, InstanceName);m_pCurrentScene = sm;//create camera//win aspect ratiofloat aspectRatio = m_pActiveWindow->GetWidth() / (float)m_pActiveWindow->GetHeight();//aspectRatio = 1.f;float fovRatio = 0.7f;m_pMainCamera = sm->CreateCamera("MainCamera", aspectRatio, fovRatio);//m_pSpaceCamera = sm->CreateCamera("CraftCamera",aspectRatio,fovRatio);sm->SetActiveCamera(m_pMainCamera);SceneNode* camNode = m_pCurrentScene->GetRootSceneNode()->CreateChildSceneNode("MainCamera");Point3 camPos(0.f, 0.f, 50.f);camNode->SetPosition(camPos);Quaternion orient;camNode->AttachObject(m_pMainCamera);m_pCurrentScene->SetActiveCamera(m_pMainCamera);m_pActiveViewport = m_pActiveWindow->AddViewport(m_pMainCamera);}

             SceneManager创建Entity以及对应的SceneNode,

             设置SceneNode的位置pos

                    以及方位quat(关于四元数Quaternion参考前面的OpenGL系列文章)

             Entity需要AttachObject到SceneNode上才能显示

void SolarSystem::SetupSolarSystem(Tomo::SceneManager* curScene){m_pCurScene = curScene;//Tomo::SceneNode* sunNode = curScene->GetRootSceneNode()->CreateChildSceneNode("Sun");Tomo::Vector3 pos(0.f,0.f,-200.f);sunNode->SetPosition(pos);Tomo::Quaternion quat;quat.FromAngleAxis(PI/6,Tomo::Vector3::UNIT_X);sunNode->Rotate(quat);Tomo::Entity* sunEnt = curScene->CreateEntity("Sun", "sun.meshml");m_pSun = new Planet(0,0.f,sunNode,sunEnt,0);Tomo::SceneNode* mercuryNode = sunNode->CreateChildSceneNode("Mercury");pos.x = 100.f;pos.z = 0.f;mercuryNode->SetPosition(pos);Tomo::Vector3 scale(0.3f, 0.3f, 0.3f);mercuryNode->SetScale(scale);Tomo::Entity* mercuryEnt = curScene->CreateEntity("Mercury", "mercury.meshml");Tomo::Entity* orbitEnt = curScene->CreateEntity("Orbit_Mercury", "orbit.meshml");m_pMercury = new Planet(m_pSun, 0.6f, mercuryNode, mercuryEnt, orbitEnt);}


           创建SkyBox作为星空

void App3DSpaceTravel::SetupEarthScene(){m_pCurrentScene->SetSkyBox(true,"SpaceSkyBox",2000.f);}

         Step03 - control scene 场景控制

               在FrameRenderingQueued里面更新每一帧

bool App3DSpaceTravel::FrameRenderingQueued(const FrameEvent& evt){App3DFramework::FrameRenderingQueued(evt);if (m_spriteController){if (initPopular_ < 1)++initPopular_;if (1 == initPopular_){LOGINFO("Initialise Resource Group Popular");LoadRes();++initPopular_;}if (0.f == m_spriteController->GetDestValue()->GetValue()){m_startLogo->Hide();ControllerManager::GetSingleton().DestroyController(m_spriteController);LOGINFO("spriteController destroy");m_spriteController = 0;}}//update solar systemif(m_pSolarSystem)m_pSolarSystem->FrameUpdate(evt);return true;}
       最终效果:

 


                                 人生感悟-I'm only a visitor in Shanghai...

         

0 0
原创粉丝点击