研究生计算机图形学课程室内场景OpenGL实验报告.docx
《研究生计算机图形学课程室内场景OpenGL实验报告.docx》由会员分享,可在线阅读,更多相关《研究生计算机图形学课程室内场景OpenGL实验报告.docx(43页珍藏版)》请在冰豆网上搜索。
研究生计算机图形学课程室内场景OpenGL实验报告
《高级计算机图形学》实验报告
姓名:
学号:
班级:
【实验报告要求】
实验名称:
高级计算机图形学室场景
实验目的:
掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。
实验要求:
要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。
要求使用到光线跟踪算法、纹理映射技术以及实时绘制技术。
一、实验效果图
图1:
正面效果图
图2:
背面效果图
图4:
背面效果图
图4:
室场景细节效果图
图5:
场景角度转换效果图
二、源文件数据代码:
共6个文件,其实现代码如下:
1、DlgAbout.cpp
#include"StdAfx.h"
#include"DlgAbout.h"
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
END_MESSAGE_MAP()
2、FormCommandView.cpp
#include"stdafx.h"
#include"Tool.h"
#include"MainFrm.h"
#include"FormCommandView.h"
#include"ToolDoc.h"
#include"RenderView.h"
//Downloadby
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
//CFormCommandView
IMPLEMENT_DYNCREATE(CFormCommandView,CFormView)
CFormCommandView:
:
CFormCommandView()
:
CFormView(CFormCommandView:
:
IDD)
{
//{{AFX_DATA_INIT(CFormCommandView)
m_Smooth=FALSE;
m_Antialias=FALSE;
//}}AFX_DATA_INIT
}
CFormCommandView:
:
~CFormCommandView()
{
}
voidCFormCommandView:
:
DoDataExchange(CDataExchange*pDX)
{
CFormView:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFormCommandView)
DDX_Control(pDX,IDC_FRAME_COLOR_BACK,m_ControlBackColor);
DDX_Check(pDX,IDC_CHECK_SMOOTH,m_Smooth);
DDX_Check(pDX,IDC_CHECK_ANTIALIAS,m_Antialias);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFormCommandView,CFormView)
//{{AFX_MSG_MAP(CFormCommandView)
ON_WM_PAINT()
ON_WM_LBUTTONUP()
ON_BN_CLICKED(IDC_RADIO_MODEL_1,OnRadioModel1)
ON_BN_CLICKED(IDC_RADIO_MODEL_2,OnRadioModel2)
ON_BN_CLICKED(IDC_CHECK_SMOOTH,OnCheckSmooth)
ON_BN_CLICKED(IDC_CHECK_ANTIALIAS,OnCheckAntialias)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CFormCommandViewdiagnostics
#ifdef_DEBUG
voidCFormCommandView:
:
AssertValid()const
{
CFormView:
:
AssertValid();
}
voidCFormCommandView:
:
Dump(CDumpContext&dc)const
{
CFormView:
:
Dump(dc);
}
CToolDoc*CFormCommandView:
:
GetDocument()//non-debugversionisinline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CToolDoc)));
return(CToolDoc*)m_pDocument;
}
#endif//_DEBUG
//OnPaint
voidCFormCommandView:
:
OnPaint()
{
//Devicecontextforpainting
CPaintDCdc(this);
//OptionsarestoredinApplication
CToolApp*pApp=(CToolApp*)AfxGetApp();
CRectrect;
//Colorback
m_ControlBackColor.GetWindowRect(&rect);
ScreenToClient(&rect);
CBrushBrushBack(pApp->m_OptionColorGlBack);
dc.FillRect(&rect,&BrushBack);
}
//OnLButtonUp
voidCFormCommandView:
:
OnLButtonUp(UINTnFlags,
CPointpoint)
{
CRectrect;
CToolApp*pApp=(CToolApp*)AfxGetApp();
//Optionbackcolor
m_ControlBackColor.GetWindowRect(&rect);
ScreenToClient(&rect);
if(rect.PtInRect(point))
{
CColorDialogdlg(pApp->m_OptionColorGlBack);
if(dlg.DoModal()==IDOK)
{
pApp->m_OptionColorGlBack=dlg.GetColor();
CRenderView*pView=(CRenderView*)GetRenderView();
pView->m_ClearColorRed=(float)GetRValue(pApp->m_OptionColorGlBack)/255.0f;
pView->m_ClearColorGreen=(float)GetGValue(pApp->m_OptionColorGlBack)/255.0f;
pView->m_ClearColorBlue=(float)GetBValue(pApp->m_OptionColorGlBack)/255.0f;
this->InvalidateRect(&rect,FALSE);
pView->InvalidateRect(NULL,FALSE);
}
}
CFormView:
:
OnLButtonUp(nFlags,point);
}
//GetRenderView
CView*CFormCommandView:
:
GetRenderView()
{
CToolApp*pApp=(CToolApp*)AfxGetApp();
CMainFrame*pFrame=(CMainFrame*)pApp->m_pMainWnd;
CView*pView=(CView*)pFrame->m_wndSplitter.GetPane(0,1);
returnpView;
}
//Model
voidCFormCommandView:
:
OnRadioModel1()
{
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
this->GetRenderView()->InvalidateRect(NULL,FALSE);
}
voidCFormCommandView:
:
OnRadioModel2()
{
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
this->GetRenderView()->InvalidateRect(NULL,FALSE);
}
//OnCheckSmooth
voidCFormCommandView:
:
OnCheckSmooth()
{
m_Smooth=!
m_Smooth;
if(m_Smooth)
glShadeModel(GL_SMOOTH);
else
glShadeModel(GL_FLAT);
this->GetRenderView()->InvalidateRect(NULL,FALSE);
}
//OnCheckAntialias
//Toggleantialiasedlines
voidCFormCommandView:
:
OnCheckAntialias()
{
m_Antialias=!
m_Antialias;
if(m_Antialias)
{
glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
glLineWidth(1.5f);
}
else
{
glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
glLineWidth(1.0f);
}
GetRenderView()->InvalidateRect(NULL,FALSE);
}
3、MainFrm.cpp
#include"stdafx.h"
#include"Tool.h"
//Downloadby
#include"MainFrm.h"
#include"FormCommandView.h"
#include"RenderView.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
//CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame,CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
staticUINTindicators[]=
{
ID_SEPARATOR,//statuslineindicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
//CMainFrameconstruction/destruction
CMainFrame:
:
CMainFrame()
{
}
CMainFrame:
:
~CMainFrame()
{
}
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
if(!
m_wndToolBar.Create(this)||
!
m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failedtocreatetoolbar\n");
return-1;//failtocreate
}
if(!
m_wndStatusBar.Create(this)||
!
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failedtocreatestatusbar\n");
return-1;//failtocreate
}
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()|
CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);
return0;
}
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
cs.cx=600;cs.cy=500;
returnCFrameWnd:
:
PreCreateWindow(cs);
}
//CMainFramediagnostics
#ifdef_DEBUG
voidCMainFrame:
:
AssertValid()const
{
CFrameWnd:
:
AssertValid();
}
voidCMainFrame:
:
Dump(CDumpContext&dc)const
{
CFrameWnd:
:
Dump(dc);
}
#endif//_DEBUG
//CMainFramemessagehandlers
voidCMainFrame:
:
OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting
}
BOOLCMainFrame:
:
OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext)
{
if(!
m_wndSplitter.CreateStatic(this,1,2,WS_CHILD|WS_VISIBLE))
{
TRACE("FailedtoCreateStaticSplitter\n");
returnFALSE;
}
//Firstsplitterpane
if(!
m_wndSplitter.CreateView(0,0,
RUNTIME_CLASS(CRenderView),CSize(600,500),pContext))
{
TRACE("Failedtocreatecommandviewpane\n");
returnFALSE;
}
if(!
m_wndSplitter.CreateView(0,1,
RUNTIME_CLASS(CFormCommandView),CSize(0,0),pContext))
{
TRACE("Failedtocreatecommandviewpane\n");
returnFALSE;
}
//Secondsplitterpane
returnTRUE;
}
4、RenderView.cpp
#include"stdafx.h"
#include"Tool.h"
#include
#include
#include
#include"ToolDoc.h"
#include"RenderView.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
externvoidRender(void);
//Thisistheholdingspaceforthelandscapecolours.
intWinWidth,WinHeigth;
unsignedshortintcomp=32;//Scalemodifier.
unsignedshortinttemp,texture_mapping=FALSE,
land_fogging=TRUE,flat_shading=TRUE;
floatangle,Near,ex,ey,ez,cx,cy,cz;
//Initialeyepositionandvectorofsight.
staticGLfloatspeed=0;
//Thefollowingcodeformouseroutineswascontributed.
//Theseareusedforthemotionfunction.
#defineFORWARD1
#defineUP2
#defineTURNLEFT3
#defineLOOKUP5
//Mousepositionandbutton.
intoldmx=0,oldmy=0,mb;
//CRenderView
IMPLEMENT_DYNCREATE(CRenderView,CView)
BEGIN_MESSAGE_MAP(CRenderView,CView)
//{{AFX_MSG_MAP(CRenderView)
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
ON_WM_CREATE()
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_COMMAND(ID_FILE_PRINT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:
:
OnFilePrintPreview)
END_MESSAGE_MAP()
//CRenderViewconstruction/destruction
CRenderView:
:
CRenderView()
{
//OpenGL
m_hGLContext=NULL;
m_GLPixelIndex=0;
//Mouse
m_LeftButtonDown=FALSE;
m_RightButtonDown=FALSE;
m_CursorRotation=AfxGetApp()->LoadCursor(IDC_CURSOR_ROTATION);
//Colors
CToolApp*pApp=(CToolApp*)AfxGetApp();
m_ClearColorRed=GetRValue(pApp->m_OptionColorGlBack);
m_ClearColorGreen=GetGValue(pApp->m_OptionColorGlBack);
m_ClearColorBlue=GetBValue(pApp->m_OptionColorGlBack);
ReadData();
WinWidth=1000;
WinHeigth=800;
LoadAllTexture();
InitLookAt();
}
//============================================
//InitGeometry
//============================================
voidCRenderView:
:
InitGeometry(void)
{
GLfloatfogColor[4]={0.75,0.75,1.0,1.0};
speed=0;
srand(224);
srand((unsigned)time(NULL));
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
glFogi(GL_FOG_MODE,GL_LINEAR);
glFogfv(GL_FOG_COLOR,fogColor);
glFogf(GL_FOG_DENSITY,0.8f);
glFogf(GL_FOG_START,400.0f);
glFogf(GL_FOG_END,500.0f);
glClearColor(0.75f,0.75f,1.0f,1.0f);
}
CRenderView:
:
~CRenderView()
{
FreeAllTexture();
freelist();
}
BOOLCRenderView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
returnCView:
:
PreCreateWindow(cs);
}