《基于MFC的OpenGL编程》Part 19 Creating a Virtual Reality Walkthrough Application

        本文是整个系列文章的最后一篇,将创建一个完整的虚拟office应用程序(如图所示)来做为ending.

1,CCY457OpenGLView类中加入下述变量,用来保存office内各个物体的显示列表

复制代码
    //Display List Names
    GLuint m_SceneList;
    GLuint m_ComputerList;
    GLuint m_ChairList;
    GLuint m_BlindsList;
    GLuint m_MonitorList;
    GLuint m_BooksList;
    GLuint m_PhoneList;
    GLuint m_DoorList;
复制代码

2,创建房间内部场景

复制代码

//Create the Display List for the Scene
void CCY457OpenGLView::CreateSceneList()
{
    m_SceneList 
= glGenLists(1);
    glNewList(m_SceneList, GL_COMPILE);
    
/******************Setup Lighting**********************/
    SetupLighting();
    
/***************Draw the Scene*************************/
    
//Draw the Walls
    DrawWalls();            
    
//Draw the Wall Tops, Sides and Desks
    DrawWallTopsAndSides();
    
//Draw the desks
    DrawDesks();
    
//Draw the computers
    DrawComputers();    
    
//Draw the Chairs
    DrawChairs();
    
//Draw the Blinds
    DrawBlinds();
    
//Draw Phones
    DrawPhones();
    
//Draw Floor and Ceiling
    DrawFloorAndCeiling();
    glEndList();
}
复制代码

3,Obj文件中加载各个物件的3D模型

复制代码
//Load all the Models from the Files of type .obj
void CCY457OpenGLView::LoadModelsFromFiles()
{
    GLfloat scalefactor 
= 0.0;
    
//Load Computer from file
    GLMmodel *object1;
    object1 
= glmReadOBJ("Data/models/computer.obj");
    
if(!scalefactor) 
    {
        scalefactor 
= glmUnitize(object1);
    } 
    
else 
    {
        glmScale(object1, scalefactor);
    }
    glmScale(object1, 
1.5);    
    
/* build a display list */
    m_ComputerList 
= glmList(object1, GLM_SMOOTH);
    
/* nuke it, we don't need it anymore */
    glmDelete(object1);    
    
//Load Chair From File
    GLMmodel *object2;
    scalefactor 
= 0.0;
    object2 
= glmReadOBJ("Data/models/chair04.obj");
    
if(!scalefactor) 
    {
        scalefactor 
= glmUnitize(object2);
    } 
    
else 
    {
        glmScale(object2, scalefactor);
    }
    glmScale(object2, 
2.5);    
    
/* build a display list */
    m_ChairList 
= glmList(object2, GLM_SMOOTH);
    
/* nuke it, we don't need it anymore */
    glmDelete(object2);    
    
//Load Blinds Object From File
    GLMmodel *object3;
    scalefactor 
= 0.0;
    object3 
= glmReadOBJ("Data/models/blinds.obj");
    
if(!scalefactor) 
    {
        scalefactor 
= glmUnitize(object3);
    } 
    
else 
    {
        glmScale(object3, scalefactor);
    }
    glmScale(object3, 
1.0);    
    
/* build a display list */
    m_BlindsList 
= glmList(object3, GLM_SMOOTH);
    
/* nuke it, we don't need it anymore */
    glmDelete(object3);    
    
//Load Books Object from file
    GLMmodel *object4;
    scalefactor 
= 0.0;
    object4 
= glmReadOBJ("Data/models/books.obj");
    
if(!scalefactor) 
    {
        scalefactor 
= glmUnitize(object4);
    } 
    
else 
    {
        glmScale(object4, scalefactor);
    }
    glmScale(object4, 
1.2);    
    
/* build a display list */
    m_BooksList 
= glmList(object4, GLM_SMOOTH);
    
/* nuke it, we don't need it anymore */
    glmDelete(object4);    
    
//Load Monitor from file
    GLMmodel *object5;
    scalefactor 
= 0.0;
    object5 
= glmReadOBJ("Data/models/samsung.obj");
    
if(!scalefactor) 
    {
        scalefactor 
= glmUnitize(object5);
    } 
    
else 
    {
        glmScale(object5, scalefactor);
    }
    glmScale(object5, 
0.20);    
    
/* build a display list */
    m_MonitorList 
= glmList(object5, GLM_SMOOTH);
    
/* nuke it, we don't need it anymore */
    glmDelete(object5);    
    
//Load Phone Object from file
    GLMmodel *object6;
    scalefactor 
= 0.0;
    object6 
= glmReadOBJ("Data/models/phone.obj");
    
if(!scalefactor) 
    {
        scalefactor 
= glmUnitize(object6);
    } 
    
else 
    {
        glmScale(object6, scalefactor);
    }
    glmScale(object6, 
0.08);    
    
/* build a display list */
    m_PhoneList 
= glmList(object6, GLM_SMOOTH);
    
/* nuke it, we don't need it anymore */
    glmDelete(object6);        
}
复制代码

4,创建各个具体物件的代码:

创建各个物体

 

posted on   Phinecos(洞庭散人)  阅读(5469)  评论(5编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

统计

点击右上角即可分享
微信分享提示