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

更新时间:2024-06-09 08:19: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

void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); }

#endif //_DEBUG

// CMainFrame message handlers void CMainFrame::OnPaint() { CPaintDC dc(this); // device context for painting }

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if (!m_wndSplitter.CreateStatic(this, 1, 2,WS_CHILD | WS_VISIBLE)) { TRACE(\ return FALSE; } // First splitter pane if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CRenderView), CSize(600,500), pContext)) { TRACE(\ return FALSE; } if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CFormCommandView), CSize(0,0), pContext)) { TRACE(\ return FALSE; } // Second splitter pane return TRUE; }

4、RenderView.cpp

11

#include \#include \#include #include #include

#include \#include \

#ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

extern void Render(void);

// This is the holding space for the landscape colours.

int WinWidth, WinHeigth;

unsigned short int comp = 32; // Scale modifier.

unsigned short int temp, texture_mapping = FALSE,

land_fogging = TRUE, flat_shading = TRUE;

float angle, Near, ex, ey, ez, cx, cy, cz;

// Initial eye position and vector of sight. static GLfloat speed = 0;

// The following code for mouse routines was contributed. // These are used for the motion function. #define FORWARD 1 #define UP 2

#define TURNLEFT 3 #define LOOKUP 5

// Mouse position and button.

12

int oldmx = 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 // Standard printing commands

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()

// CRenderView construction/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);

13

ReadData();

WinWidth=1000; WinHeigth=800; LoadAllTexture(); InitLookAt(); }

//============================================ // InitGeometry

//============================================ void CRenderView::InitGeometry(void) {

GLfloat fogColor[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(); }

BOOL CRenderView::PreCreateWindow(CREATESTRUCT& cs) {

return CView::PreCreateWindow(cs);

14

}

// CRenderView drawing

void CRenderView::OnDraw(CDC* pDC) { }

BOOL CRenderView::OnPreparePrinting(CPrintInfo* pInfo) {

return DoPreparePrinting(pInfo); }

void CRenderView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { }

void CRenderView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { }

// CRenderView diagnostics #ifdef _DEBUG

void CRenderView::AssertValid() const {

CView::AssertValid(); }

void CRenderView::Dump(CDumpContext& dc) const {

CView::Dump(dc); }

CToolDoc* CRenderView::GetDocument() // non-debug version is inline {

if (m_pDocument){

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CToolDoc))); return (CToolDoc*)m_pDocument; }

else return NULL;

15

}

#endif //_DEBUG

// Create OpenGL rendering context

int CRenderView::OnCreate(LPCREATESTRUCT lpCreateStruct) {

if (CView::OnCreate(lpCreateStruct) == -1) return -1;

HWND hWnd = GetSafeHwnd(); HDC hDC = ::GetDC(hWnd);

if(SetWindowPixelFormat(hDC)==FALSE) return 0;

if(CreateViewGLContext(hDC)==FALSE) return 0;

// Default mode

glPolygonMode(GL_FRONT,GL_FILL); glPolygonMode(GL_BACK,GL_FILL); glShadeModel(GL_FLAT);

// light must be disabled // while rendering the terrain

// because it has no normal definition InitGeometry();

glEnable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); return 0; }

BOOL CRenderView::SetWindowPixelFormat(HDC hDC) {

PIXELFORMATDESCRIPTOR pixelDesc;

pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR); pixelDesc.nVersion = 1;

16

pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_STEREO_DONTCARE;

pixelDesc.iPixelType = PFD_TYPE_RGBA; pixelDesc.cColorBits = 32; pixelDesc.cRedBits = 8; pixelDesc.cRedShift = 16; pixelDesc.cGreenBits = 8; pixelDesc.cGreenShift = 8; pixelDesc.cBlueBits = 8; pixelDesc.cBlueShift = 0; pixelDesc.cAlphaBits = 0; pixelDesc.cAlphaShift = 0; pixelDesc.cAccumBits = 64; pixelDesc.cAccumRedBits = 16; pixelDesc.cAccumGreenBits = 16; pixelDesc.cAccumBlueBits = 16; pixelDesc.cAccumAlphaBits = 0; pixelDesc.cDepthBits = 32; pixelDesc.cStencilBits = 8; pixelDesc.cAuxBuffers = 0;

pixelDesc.iLayerType = PFD_MAIN_PLANE; pixelDesc.bReserved = 0; pixelDesc.dwLayerMask = 0; pixelDesc.dwVisibleMask = 0; pixelDesc.dwDamageMask = 0;

m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc); if(m_GLPixelIndex == 0) // Choose default {

m_GLPixelIndex = 1;

if(DescribePixelFormat(hDC,m_GLPixelIndex,

sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0) return FALSE; }

if(!SetPixelFormat(hDC,m_GLPixelIndex,&pixelDesc)) return FALSE;

17

return TRUE; }

// Create an OpenGL rendering context

BOOL CRenderView::CreateViewGLContext(HDC hDC) {

m_hGLContext = wglCreateContext(hDC);

if(m_hGLContext==NULL) return FALSE;

if(wglMakeCurrent(hDC,m_hGLContext)==FALSE) return FALSE;

return TRUE; }

// Cleanup every OpenGL rendering context void CRenderView::OnDestroy() {

if(wglGetCurrentContext() != NULL) wglMakeCurrent(NULL,NULL);

if(m_hGLContext != NULL) {

wglDeleteContext(m_hGLContext); m_hGLContext = NULL; }

CView::OnDestroy(); }

void CRenderView::OnSize(UINT nType, int cx, int cy) {

CView::OnSize(nType, cx, cy);

// Set OpenGL perspective, viewport and mode CSize size(cx,cy); double aspect;

aspect = (cy == 0) ? (double)size.cx : (double)size.cx/(double)size.cy;

18

glViewport(0, 0, (GLsizei) cx, (GLsizei) cy); glMatrixMode(GL_PROJECTION); glLoadIdentity();

gluPerspective(60.0, (GLfloat) cx/(GLfloat) cy, 1.0f, 500.0f);

glMatrixMode(GL_MODELVIEW); glLoadIdentity();

gluLookAt (ex, ey, ez, cx, cy, cz, 0.0f, 1.0f, 0.0f); }

void CRenderView::OnLButtonDown(UINT nFlags, CPoint point) {

m_LeftButtonDown = TRUE; m_LeftDownPos = point;

CView::OnLButtonDown(nFlags, point); }

void CRenderView::OnLButtonUp(UINT nFlags, CPoint point) {

m_LeftButtonDown = FALSE;

CView::OnLButtonUp(nFlags, point); }

void CRenderView::OnMouseMove(UINT nFlags, CPoint point) {

switch(nFlags){

case(MK_LBUTTON): MoveEye(FORWARD,(GLfloat)(oldmy-point.y)/5.0f,1); break;

case(MK_RBUTTON):

MoveEye(TURNLEFT, (GLfloat)(oldmx-point.x), 1); break; }

oldmy = point.y; oldmx = point.x; Invalidate(FALSE);

CView::OnMouseMove(nFlags, point);

19

}

void CRenderView::OnPaint() {

// Device context for painting CPaintDC dc(this);

// Useful in singledoc templates HWND hWnd = GetSafeHwnd(); HDC hDC = ::GetDC(hWnd);

wglMakeCurrent(hDC,m_hGLContext);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glClearColor(m_ClearColorRed,m_ClearColorGreen,m_ClearColorBlue,1.0f); glPushMatrix();

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); InitRenderWin(); Render();

// Double buffers SwapBuffers(hDC); }

// Function that moves the eye or turns the angle of sight. // Updates scene if update != 0.

void CRenderView::MoveEye(int type, GLfloat amount, int update) {

GLfloat a;

switch(type){ case FORWARD: a = sqrt((cx-ex)*(cx-ex)+(cz-ez)*(cz-ez)); ex = (amount*(cx-ex)+a*ex) / a; ez = (amount*(cz-ez)+a*ez) / a; cx = (amount*(cx-ex)+a*cx) / a; cz = (amount*(cz-ez)+a*cz) / a; break;

case TURNLEFT:

cx = (cx-ex)*(float)cos(amount/360.0f) + (cz-ez)*(float)sin(amount/360.0f)+ex; cz = (cz-ez)*(float)cos(amount/360.0f) - (cx-ex)*(float)sin(amount/360.0f)+ez;

20

break; case UP:

ey += amount; break;

case LOOKUP: cy += amount; break; }

if (update){

glMatrixMode(GL_MODELVIEW); glLoadIdentity();

gluLookAt(ex, ey, ez, cx, cy, cz, 0.0f,1.0f,0.0f); } }

TEXTURE_2D **TextureList; OBJECT *ObjectList; /* ObjectList[0]:isolated surfaces*/

INT4S ObjectNum;

char gEnergyFile[30]; char sLookAtFN[100]; char ImageName[30];

void CRenderView::ReadData() {

int i,j,l; FILE *fp;

char stemp[100]; POINT3D *plist;

INT4U nAllVertexNum; INT4U *pchlist;

strcpy(gEnergyFile,\ fp = fopen( gEnergyFile, \ if ( fp == NULL ) {

21

printf( \ exit(0); }

fseek( fp, 0, SEEK_SET);

/****** read texture list ******/ fscanf( fp, \

while( strcmp( stemp,\ fscanf( fp, \ fscanf( fp, \

TextureList = (TEXTURE_2D **)malloc( sizeof(TEXTURE_2D)*(texnum+1)); for(i=1; i<=texnum; i++) { TextureList[i] = (TEXTURE_2D *)malloc( sizeof(TEXTURE_2D)); fscanf( fp, \ if ( strcmp( stemp,\T_TEXTURE\ TextureList[i]->type = 1; else if ( strcmp( stemp,\ TextureList[i]->type = 0; }

/****** Read object list ******/ fscanf( fp, \

while( strcmp( stemp,\ fscanf( fp, \

ObjectList = (OBJECT *)malloc( sizeof(OBJECT ) * ObjectNum); for(i = 0; i < ObjectNum; i ++ ) { fscanf( fp, \ while( strcmp( stemp,\ fscanf( fp, \ ObjectList[i].surflist = (SURFACE *)malloc( sizeof(SURFACE) * ObjectList[i].SurfNum); for(j = 0; j < ObjectList[i].SurfNum; j ++ ) {

22

/****** Read surface infor ******/ fscanf( fp, \ while( strcmp( stemp,\ fscanf( fp, \ fscanf( fp, \ while( strcmp( stemp,\ fscanf( fp, \ fscanf( fp, \ while( strcmp( stemp,\ fscanf( fp, \ fscanf( fp, \ while( strcmp( stemp,\ fscanf( fp, \ /****** Read point list ******/ ObjectList[i].surflist[j].pointlist = (POINT3D*)malloc(sizeof(POINT3D) * ObjectList[i].surflist[j].pointn); plist = ObjectList[i].surflist[j].pointlist; for( l = 0; l < ObjectList[i].surflist[j].pointn ; l ++ ) fscanf( fp, \ &(plist[l].r), &(plist[l].g), &(plist[l].b), &(plist[l].u), &(plist[l].v), &(plist[l].x), &(plist[l].y), &(plist[l].z) ); /****** Read patchlist ******/ nAllVertexNum = ObjectList[i].surflist[j].triangle * 3 + ObjectList[i].surflist[j].quadric *4 ; ObjectList[i].surflist[j].patchlist = (INT4U *)malloc( sizeof(INT4U) nAllVertexNum); pchlist = ObjectList[i].surflist[j].patchlist;

23

*

for( l = 0; l < nAllVertexNum; l ++ ) fscanf( fp, \ }

}

fclose(fp); }

void CRenderView::InitLookAt() {

FILE *fp;

strcpy(sLookAtFN,\ fp = fopen(sLookAtFN, \ if (fp == NULL) { ex = ey = ez =1.0f; cx = cy = cz =0.0f; Near = 0.1f; angle = 30.0f; }

else fscanf(fp, \ fclose(fp); }

void CRenderView::InitRenderWin() {

glShadeModel ( GL_SMOOTH ); glDepthFunc ( GL_LESS );

glEnable ( GL_DEPTH_TEST );

glMatrixMode ( GL_PROJECTION ); glLoadIdentity();

glMatrixMode ( GL_MODELVIEW ); glLoadIdentity();

gluPerspective ( angle, (float)WinWidth/(float)WinHeigth, Near, 1000000000.0); gluLookAt( ex, ey, ez, cx, cy, cz, 0.0, 1.0, 0.0); }

24

void CRenderView::Render(void) {

int i, j, k, l, m, TexIndex; POINT3D *plist; INT4U *pchlist;

glClear

(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_ACCUM_BUFFER_BIT); for(i = 0; i < ObjectNum; i ++ ) for(j = 0; j < ObjectList[i].SurfNum; j ++ ) { TexIndex = ObjectList[i].surflist[j].texId; if( TexIndex > 0 ) InitTex( TexIndex ); plist = ObjectList[i].surflist[j].pointlist; pchlist = ObjectList[i].surflist[j].patchlist; l = 0; for ( k = 0; k < ObjectList[i].surflist[j].triangle; k ++) { glBegin( GL_TRIANGLES ); for( m = 0; m < 3; m ++ ) { glColor3f ( plist[pchlist[l]].r, plist[pchlist[l]].g, plist[pchlist[l]].b ); glTexCoord2f( plist[pchlist[l]].u, plist[pchlist[l]].v ); glVertex3f( plist[pchlist[l]].x, plist[pchlist[l]].y, plist[pchlist[l]].z ); l ++; }/* m */ glEnd(); }/* k */ for ( k = 0; k < ObjectList[i].surflist[j].quadric; k ++) {

25

glBegin( GL_QUADS ); for( m = 0; m < 4; m ++ ) { glColor3f ( plist[pchlist[l]].r, plist[pchlist[l]].g, plist[pchlist[l]].b ); glTexCoord2f( plist[pchlist[l]].u, plist[pchlist[l]].v ); glVertex3f( plist[pchlist[l]].x, plist[pchlist[l]].y, plist[pchlist[l]].z ); l ++; }/* m */ glEnd(); }/* k */ glFlush(); CloseTex(); } }

void CRenderView::freelist() { int i, j; for( i=0; i

free(ObjectList);

for(i=1; i<=texnum; i++) free(TextureList[i]); free(TextureList); }

26

extern TEXTURE_2D **TextureList;

/********************************/ /* function : OpenTexImage */ /********************************/ unsigned char *CRenderView::OpenTexImage( INT2U TexIndex, INT2U *rslx, INT2U *rsly ) { unsigned char *image; FILE *fp; INT2U srcx, srcy; INT4U i, j; char ImageName[30]; unsigned char *SImageData; int rc; int width, height; strcpy( ImageName, TextureList[TexIndex]->fname); /* load a image */

fp = fopen(ImageName,\ if(!fp) return 0; fseek(fp,18L,0);

rc=fread(&width,sizeof(long),1,fp); rc=fread(&height,sizeof(long),1,fp); *rslx=srcx=width; *rsly=srcy=height; fseek(fp,54L,0);

image = (unsigned char *)malloc(width*height*3); rc=fread(image,width*height*3,1,fp); fclose(fp); SImageData = (unsigned char *)malloc(srcx*srcy*3); for(i=0; i

27

= (unsigned = (unsigned = (unsigned

} }

free(image); printf(\ return( SImageData ); }

/********************************/ /* function : InitTex */

/********************************/ void CRenderView::InitTex( int TexIndex ) { INT2U TextType; unsigned char *ImageData; static int OldIndex = -1; if(TexIndex<=0) return; if(TexIndex == OldIndex) { glEnable(GL_TEXTURE_2D); return; } ImageData = ImageDatas[TexIndex-1]; TextType = TextureList[TexIndex]->type; glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); if( TextType == CLAMP_TEXTURE ) { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); } else {

28

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } glTexImage2D( GL_TEXTURE_2D, 0, 3, rslxs[TexIndex-1], rslys[TexIndex-1], 0,GL_RGB, GL_UNSIGNED_BYTE, ImageData ); glEnable(GL_TEXTURE_2D); OldIndex = TexIndex; }

/********************************/ /* function : CloseTex */

/********************************/ void CRenderView::CloseTex() { glDisable(GL_TEXTURE_2D); }

void CRenderView::LoadAllTexture() {

int i; for (i=0; i

void CRenderView::FreeAllTexture() {

int i; for (i=0; i

5、StdAfx.cpp #include \

6、Tool.cpp

#include \

29

#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

// CToolApp

CToolDoc *MyDocument;

BEGIN_MESSAGE_MAP(CToolApp, CWinApp) //{{AFX_MSG_MAP(CToolApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) //}}AFX_MSG_MAP // Standard file based document commands // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()

// CToolApp construction CToolApp::CToolApp() { // Options m_OptionColorGlBack = RGB(0,0,255); }

// The one and only CToolApp object CToolApp theApp;

// CToolApp initialization

BOOL CToolApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization

30

// If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif // Change the registry key under which our settings are stored. // You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey(_T(\ LoadStdProfileSettings(10); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CSingleDocTemplate* pDocTemplate; // create main SDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; pDocTemplate = new CSingleDocTemplate( IDR_MODELTYPE, RUNTIME_CLASS(CToolDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CRenderView)); AddDocTemplate(pDocTemplate); // The main window has been initialized, so show and update it. //pMainFrame->ShowWindow(SW_SHOWMAXIMIZED); pMainFrame->ShowWindow(SW_SHOW); pMainFrame->UpdateWindow();

31

return TRUE; }

// App command to run the dialog void CToolApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); }

6、ToolDoc.cpp #include \#include \#include \

#include \

#ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

IMPLEMENT_DYNCREATE(CToolDoc, CDocument)

BEGIN_MESSAGE_MAP(CToolDoc, CDocument) //{{AFX_MSG_MAP(CToolDoc) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP END_MESSAGE_MAP()

extern CToolApp theApp;

// CToolDoc construction/destruction

// Constructor

CToolDoc::CToolDoc() { }

32

// Destructor

CToolDoc::~CToolDoc() { }

BOOL CToolDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; return TRUE; }

// CToolDoc serialization

void CToolDoc::Serialize(CArchive& ar) { if (ar.IsStoring()){} else{} }

///////////////////////////////////////////////////////////////////////////// // CToolDoc diagnostics

#ifdef _DEBUG

void CToolDoc::AssertValid() const { CDocument::AssertValid(); }

void CToolDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); }

#endif //_DEBUG 三、实验总结:

通过本次实验,我进一步认识到了OPENGL的强大功能,同时我也认识到学习好《高级计算机图形学》的重要意义,同时在对场景的实现过程中,我更加深刻地理解了各种算法。

33

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

Top