研究生计算机图形学课程室内场景OpenGL--实验报告

更新时间:2023-12-20 06:15:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《高级计算机图形学》实验报告

姓 名: 学号: 班级:

【实验报告要求】

实验名称:高级计算机图形学室内场景

实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。

实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、纹理映射技术以及实时绘制技术

一、实验效果图

图1:正面效果图

1

图2:背面效果图

图4:背面效果图

2

图4:室内场景细节效果图

图5:场景角度转换效果图

3

二、源文件数据代码:

共6个文件,其实现代码如下: 1、DlgAbout.cpp #include \#include \

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { }

void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); }

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP()

2、FormCommandView.cpp #include \#include \#include \

#include \#include \#include \

// Download by http://www.codefans.net #ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

// CFormCommandView

IMPLEMENT_DYNCREATE(CFormCommandView, CFormView)

CFormCommandView::CFormCommandView() : CFormView(CFormCommandView::IDD) { //{{AFX_DATA_INIT(CFormCommandView)

4

m_Smooth = FALSE; m_Antialias = FALSE; //}}AFX_DATA_INIT }

CFormCommandView::~CFormCommandView() { }

void CFormCommandView::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()

///////////////////////////////////////////////////////////////////////////// // CFormCommandView diagnostics

#ifdef _DEBUG

void CFormCommandView::AssertValid() const { CFormView::AssertValid(); }

5

void CFormCommandView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); }

CToolDoc* CFormCommandView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CToolDoc))); return (CToolDoc*)m_pDocument; }

#endif //_DEBUG

// OnPaint

void CFormCommandView::OnPaint() { // Device context for painting CPaintDC dc(this); // Options are stored in Application CToolApp *pApp = (CToolApp *)AfxGetApp(); CRect rect; // Color back m_ControlBackColor.GetWindowRect(&rect); ScreenToClient(&rect); CBrush BrushBack(pApp->m_OptionColorGlBack); dc.FillRect(&rect,&BrushBack); }

// OnLButtonUp

void CFormCommandView::OnLButtonUp(UINT nFlags, CPoint point)

{ CRect rect; CToolApp *pApp = (CToolApp *)AfxGetApp();

6

// Option back color m_ControlBackColor.GetWindowRect(&rect); ScreenToClient(&rect); if(rect.PtInRect(point)) { CColorDialog dlg(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); return pView; }

// Model

void CFormCommandView::OnRadioModel1() { glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); this->GetRenderView()->InvalidateRect(NULL,FALSE); }

7

= = =

void CFormCommandView::OnRadioModel2() { glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); this->GetRenderView()->InvalidateRect(NULL,FALSE); }

// OnCheckSmooth

void CFormCommandView::OnCheckSmooth() { m_Smooth = !m_Smooth; if(m_Smooth) glShadeModel(GL_SMOOTH); else glShadeModel(GL_FLAT); this->GetRenderView()->InvalidateRect(NULL,FALSE); }

// OnCheckAntialias // Toggle antialiased lines

void CFormCommandView::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); }

8

}

GetRenderView()->InvalidateRect(NULL,FALSE);

3、MainFrm.cpp #include \#include \

// Download by http://www.codefans.net #include \

#include \#include \

#ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_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()

static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, };

// CMainFrame construction/destruction CMainFrame::CMainFrame() { }

9

CMainFrame::~CMainFrame() { }

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0(\ return -1; // fail to create } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0(\ return -1; // fail to create } m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); return 0; }

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { cs.cx = 600; cs.cy = 500; return CFrameWnd::PreCreateWindow(cs); }

// CMainFrame diagnostics #ifdef _DEBUG

void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); }

10

本文来源:https://www.bwwdw.com/article/inw5.html

Top