研究生计算机图形学课程室内场景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 \
#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
正在阅读:
研究生计算机图形学课程室内场景OpenGL--实验报告06-09
政治学习心得体会(最新6篇)03-25
法理学作业及答案12-07
《证据学》课程教学大纲09-19
关于城乡居民养老保险这些事,你得知道!02-21
两个字的好词,2个字的词语大全02-14
2018年12月西南网络教育-0649植物学基础-大作业答案 - 图文01-03
UML在线音乐系统06-01
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 图形
- 场景
- 研究生
- 室内
- 课程
- 实验
- 计算机
- 报告
- OpenGL