研究报告生计算机图形学课程室内场景OpenGL-实验报告_第1页
研究报告生计算机图形学课程室内场景OpenGL-实验报告_第2页
研究报告生计算机图形学课程室内场景OpenGL-实验报告_第3页
研究报告生计算机图形学课程室内场景OpenGL-实验报告_第4页
研究报告生计算机图形学课程室内场景OpenGL-实验报告_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-PAGE . z.高级计算机图形学实验报告姓 名:*:班级:【实验报告要求】实验名称:高级计算机图形学室场景实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、纹理映射技术以及实时绘制技术。一、实验效果图图1:正面效果图图2:反面效果图图4:反面效果图图4:室场景细节效果图图5:场景角度转换效果图二、源文件数据代码:共6个文件,其实现代码如下:1、Dlg

2、About.cpp#include StdAf*.h#include DlgAbout.hCAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataE*change(CDataE*change* pD*)CDialog:DoDataE*change(pD*);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()2、FormmandView.cpp#include stdaf*.h#include Tool.h#include MainFrm.h#include F

3、ormmandView.h#include ToolDoc.h#include RenderView.h/ Download by #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CFormmandViewIMPLEMENT_DYNCREATE(CFormmandView, CFormView)CFormmandView:CFormmandView(): CFormView(CFormmandView:IDD)/AF*_DATA_INIT(CFormmandView

4、)m_Smooth = FALSE;m_Antialias = FALSE;/AF*_DATA_INITCFormmandView:CFormmandView()void CFormmandView:DoDataE*change(CDataE*change* pD*)CFormView:DoDataE*change(pD*);/AF*_DATA_MAP(CFormmandView)DD*_Control(pD*, IDC_FRAME_COLOR_BACK, m_ControlBackColor);DD*_Check(pD*, IDC_CHECK_SMOOTH, m_Smooth);DD*_Ch

5、eck(pD*, IDC_CHECK_ANTIALIAS, m_Antialias);/AF*_DATA_MAPBEGIN_MESSAGE_MAP(CFormmandView, CFormView)/AF*_MSG_MAP(CFormmandView)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_B

6、N_CLICKED(IDC_CHECK_ANTIALIAS, OnCheckAntialias)/AF*_MSG_MAPEND_MESSAGE_MAP()/ CFormmandView diagnostics#ifdef _DEBUGvoid CFormmandView:AssertValid() constCFormView:AssertValid();void CFormmandView:Dump(CDumpConte*t& dc) constCFormView:Dump(dc);CToolDoc* CFormmandView:GetDocument() / non-debug versi

7、on is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CToolDoc);return (CToolDoc*)m_pDocument;#endif /_DEBUG/ OnPaintvoid CFormmandView:OnPaint() / Device conte*t for paintingCPaintDC dc(this); / Options are stored in ApplicationCToolApp *pApp = (CToolApp *)Af*GetApp();CRect rect;/ Color backm_Contr

8、olBackColor.GetWindowRect(&rect);ScreenToClient(&rect);CBrush BrushBack(pApp-m_OptionColorGlBack);dc.FillRect(&rect,&BrushBack);/ OnLButtonUpvoid CFormmandView:OnLButtonUp(UINT nFlags, CPoint point) CRect rect;CToolApp *pApp = (CToolApp *)Af*GetApp();/ Option back colorm_ControlBackColor.GetWindowRe

9、ct(&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_Cl

10、earColorGreen = (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);/ GetRenderViewCView *CFormmandView:GetRenderView()

11、CToolApp *pApp = (CToolApp *)Af*GetApp();CMainFrame *pFrame = (CMainFrame *)pApp-m_pMainWnd;CView *pView = (CView *)pFrame-m_wndSplitter.GetPane(0,1);return pView;/ Modelvoid CFormmandView:OnRadioModel1() glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);this-GetRenderView()-InvalidateRect(NULL,FALSE); void

12、CFormmandView:OnRadioModel2() glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);this-GetRenderView()-InvalidateRect(NULL,FALSE); / OnCheckSmoothvoid CFormmandView:OnCheckSmooth() m_Smooth = !m_Smooth;if(m_Smooth)glShadeModel(GL_SMOOTH);elseglShadeModel(GL_FLAT);this-GetRenderView()-InvalidateRect(NULL,FALSE)

13、; / OnCheckAntialias/ Toggle antialiased linesvoid CFormmandView: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);elseglDisable(GL_LINE_SMO

14、OTH);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 stdaf*.h#include Tool.h/ Download by #include MainFrm.h#include FormmandView.h#include RenderView.h#ifde

15、f _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CMainFrameIMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)/AF*_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_WM_PAINT()/AF*_MSG_MAPEND_MESSAGE_MAP()static UINT indicators =ID_SEPARATOR, / status

16、 line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;/ CMainFrame construction/destructionCMainFrame:CMainFrame()CMainFrame:CMainFrame()int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;if (!m_wndToolBar.Create(this) |!m_wndTo

17、olBar.LoadToolBar(IDR_MAINFRAME)TRACE0(Failed to create toolbarn);return -1; / fail to createif (!m_wndStatusBar.Create(this) |!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)TRACE0(Failed to create status barn);return -1; / fail to createm_wndToolBar.SetBarStyle(m_wndToolBa

18、r.GetBarStyle() |CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);return 0;BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)cs.c* = 600; cs.cy = 500;return CFrameWnd:PreCreateWindow(cs);/ CMainFrame diagnostics#ifdef _DEBUGvoid CMainFrame:AssertValid() constCFrameWnd:AssertValid();void CMainFrame:Dum

19、p(CDumpConte*t& dc) constCFrameWnd:Dump(dc);#endif /_DEBUG/ CMainFrame message handlersvoid CMainFrame:OnPaint() CPaintDC dc(this); / device conte*t for paintingBOOL CMainFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateConte*t* pConte*t) if (!m_wndSplitter.CreateStatic(this, 1, 2,WS_CHILD | WS_VISI

20、BLE)TRACE(Failed to CreateStaticSplittern);return FALSE;/ First splitter paneif (!m_wndSplitter.CreateView(0, 0,RUNTIME_CLASS(CRenderView), CSize(600,500), pConte*t)TRACE(Failed to create mand view panen);return FALSE;if (!m_wndSplitter.CreateView(0, 1,RUNTIME_CLASS(CFormmandView), CSize(0,0), pCont

21、e*t)TRACE(Failed to create mand view panen);return FALSE;/ Second splitter panereturn TRUE;4、RenderView.cpp#include stdaf*.h#include Tool.h#include #include #include #include ToolDoc.h#include RenderView.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endife*tern v

22、oidRender(void);/ This is the holding space for the landscape WinWidth, WinHeigth;unsigned short int p = 32; / Scale modifier.unsigned short int temp, te*ture_mapping = FALSE, land_fogging = TRUE, flat_shading = TRUE;floatangle, Near, e*, ey, ez, c*, cy, cz;/ Initial eye position and vect

23、or 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 oldm* = 0, oldmy = 0, mb;/ CRenderViewIMPLEMENT_DYNCREATE(CRenderView,

24、CView)BEGIN_MESSAGE_MAP(CRenderView, CView)/AF*_MSG_MAP(CRenderView)ON_WM_DESTROY()ON_WM_SIZE()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_WM_PAINT()ON_WM_CREATE()/AF*_MSG_MAP/ Standard printing mandsON_MAND(ID_FILE_PRINT, CView:OnFilePrint)ON_MAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint

25、)ON_MAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CRenderView construction/destructionCRenderView:CRenderView() / OpenGL m_hGLConte*t = NULL; m_GLPi*elInde* = 0; / Mouse m_LeftButtonDown = FALSE; m_RightButtonDown = FALSE; m_CursorRotation = Af*GetApp()-LoadCursor(IDC_CURSO

26、R_ROTATION); / Colors CToolApp *pApp = (CToolApp *)Af*GetApp(); m_ClearColorRed = GetRValue(pApp-m_OptionColorGlBack); m_ClearColorGreen = GetGValue(pApp-m_OptionColorGlBack); m_ClearColorBlue = GetBValue(pApp-m_OptionColorGlBack); ReadData(); WinWidth=1000; WinHeigth=800; LoadAllTe*ture(); InitLook

27、At();/=/ InitGeometry/=void CRenderView:InitGeometry(void) GLfloat fogColor4 = 0.75, 0.75, 1.0, 1.0; speed = 0; srand(224); srand(unsigned)time(NULL); glPi*elStorei(GL_UNPACK_ALIGNMENT, 1); glEnable(GL_DEPTH_TEST); glShadeModel(GL_FLAT); glFogi(GL_FOG_MODE, GL_LINEAR); glFogfv(GL_FOG_COLOR, fogColor

28、); 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()FreeAllTe*ture();freelist();BOOL CRenderView:PreCreateWindow(CREATESTRUCT& cs) return CView:PreCreateWindow(cs);/ CRenderView drawingvoid CRender

29、View: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 _DEBUGvoid CRenderView:As

30、sertValid() const CView:AssertValid();void CRenderView:Dump(CDumpConte*t& 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;#endif /_DEBUG/ C

31、reate OpenGL rendering conte*t int CRenderView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1) return -1; HWND hWnd = GetSafeHwnd(); HDC hDC = :GetDC(hWnd); if(SetWindowPi*elFormat(hDC)=FALSE) return 0; if(CreateViewGLConte*t(hDC)=FALSE) return 0;/ Default mode glPol

32、ygonMode(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_TE*TURE_2D); glDisable(GL_LIGHTING); return 0;BOOL CRenderView:SetWindowPi*elFormat(HDC hDC) PI*E

33、LFORMATDESCRIPTOR pi*elDesc; pi*elDesc.nSize = sizeof(PI*ELFORMATDESCRIPTOR); pi*elDesc.nVersion = 1; pi*elDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_STEREO_DONTCARE; pi*elDesc.iPi*elType = PFD_TYPE_RGBA; pi*elDesc.cColorBits = 32; pi*elDesc.cRedBits = 8; pi*elDe

34、sc.cRedShift = 16; pi*elDesc.cGreenBits = 8; pi*elDesc.cGreenShift = 8; pi*elDesc.cBlueBits = 8; pi*elDesc.cBlueShift = 0; pi*elDesc.cAlphaBits = 0; pi*elDesc.cAlphaShift = 0; pi*elDesc.cAccumBits = 64; pi*elDesc.cAccumRedBits = 16; pi*elDesc.cAccumGreenBits = 16; pi*elDesc.cAccumBlueBits = 16; pi*e

35、lDesc.cAccumAlphaBits = 0; pi*elDesc.cDepthBits = 32; pi*elDesc.cStencilBits = 8; pi*elDesc.cAu*Buffers = 0; pi*elDesc.iLayerType = PFD_MAIN_PLANE; pi*elDesc.bReserved = 0; pi*elDesc.dwLayerMask = 0; pi*elDesc.dwVisibleMask = 0; pi*elDesc.dwDamageMask = 0; m_GLPi*elInde* = ChoosePi*elFormat(hDC,&pi*

36、elDesc); if(m_GLPi*elInde* = 0) / Choose default m_GLPi*elInde* = 1; if(DescribePi*elFormat(hDC,m_GLPi*elInde*, sizeof(PI*ELFORMATDESCRIPTOR),&pi*elDesc)=0) return FALSE; if(!SetPi*elFormat(hDC,m_GLPi*elInde*,&pi*elDesc) return FALSE; return TRUE;/ Create an OpenGL rendering conte*tBOOL CRenderView:

37、CreateViewGLConte*t(HDC hDC) m_hGLConte*t = wglCreateConte*t(hDC); if(m_hGLConte*t=NULL) return FALSE; if(wglMakeCurrent(hDC,m_hGLConte*t)=FALSE) return FALSE; return TRUE;/ Cleanup every OpenGL rendering conte*tvoid CRenderView:OnDestroy() if(wglGetCurrentConte*t() != NULL) wglMakeCurrent(NULL,NULL

38、); if(m_hGLConte*t != NULL) wglDeleteConte*t(m_hGLConte*t); m_hGLConte*t = NULL; CView:OnDestroy();void CRenderView:OnSize(UINT nType, int c*, int cy) CView:OnSize(nType, c*, cy); / Set OpenGL perspective, viewport and mode CSize size(c*,cy); double aspect; aspect = (cy = 0) (double)size.c* : (doubl

39、e)size.c*/(double)size.cy; glViewport(0, 0, (GLsizei) c*, (GLsizei) cy); glMatri*Mode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat) c*/(GLfloat) cy, 1.0f, 500.0f); glMatri*Mode(GL_MODELVIEW); glLoadIdentity(); gluLookAt (e*, ey, ez, c*, cy, cz, 0.0f, 1.0f, 0.0f);void CRenderView:O

40、nLButtonDown(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

41、(nFlags) case(MK_LBUTTON): MoveEye(FORWARD,(GLfloat)(oldmy-point.y)/5.0f,1);break; case(MK_RBUTTON): MoveEye(TURNLEFT, (GLfloat)(oldm*-point.*), 1); break; oldmy = point.y; oldm* = point.*; Invalidate(FALSE); CView:OnMouseMove(nFlags, point);void CRenderView:OnPaint() / Device conte*t for painting C

42、PaintDC dc(this); / Useful in singledoc templates HWND hWnd = GetSafeHwnd(); HDC hDC = :GetDC(hWnd); wglMakeCurrent(hDC,m_hGLConte*t); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(m_ClearColorRed,m_ClearColorGreen,m_ClearColorBlue,1.0f); glPushMatri*(); glClear(GL_COLOR_BUFFER_BI

43、T | 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(c*-e*)*(c*-e*)+

44、(cz-ez)*(cz-ez);e* = (amount*(c*-e*)+a*e*) / a;ez = (amount*(cz-ez)+a*ez) / a;c* = (amount*(c*-e*)+a*c*) / a;cz = (amount*(cz-ez)+a*cz) / a; break; case TURNLEFT: c* = (c*-e*)*(float)cos(amount/360.0f) + (cz-ez)*(float)sin(amount/360.0f)+e*; cz = (cz-ez)*(float)cos(amount/360.0f) - (c*-e*)*(float)si

45、n(amount/360.0f)+ez; break; case UP: ey += amount; break; case LOOKUP: cy += amount; break; if (update) glMatri*Mode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(e*, ey, ez, c*, cy, cz, 0.0f,1.0f,0.0f); TE*TURE_2D *Te*tureList;OBJECT *ObjectList;/* ObjectList0:isolated surfaces*/INT4S ObjectNum; char

46、gEnergyFile30;char sLookAtFN100;char ImageName30;void CRenderView:ReadData() int i,j,l; FILE *fp; char stemp100; POINT3D *plist; INT4U nAllVerte*Num; INT4U *pchlist; strcpy(gEnergyFile,room.ed); fp = fopen( gEnergyFile, r ); if ( fp = NULL ) printf( n Can not open energy data file:%sn, gEnergyFile);

47、 e*it(0); fseek( fp, 0, SEEK_SET); /* read te*ture list */ fscanf( fp, %s, stemp); while( strcmp( stemp,te*num ) != 0) fscanf( fp, %s, stemp); fscanf( fp, %d, &te*num ); Te*tureList = (TE*TURE_2D *)malloc( sizeof(TE*TURE_2D)*(te*num+1);for(i=1; ifname, stemp );if ( strcmp( stemp,REPEAT_TE*TURE ) = 0

48、) Te*tureListi-type = 1;else if ( strcmp( stemp,CLAMP_TE*TURE ) = 0) Te*tureListi-type = 0; /* Read object list */ fscanf( fp, %s, stemp); while( strcmp( stemp,ObjectNum ) != 0) fscanf(fp,%s,stemp); fscanf( fp, %ld, &ObjectNum); ObjectList = (OBJECT *)malloc( sizeof(OBJECT ) * ObjectNum);for(i = 0;

49、i ObjectNum; i + ) fscanf( fp, %s, stemp); while( strcmp( stemp,SurfaceNum ) != 0) fscanf(fp,%s,stemp); fscanf( fp, %ld, &(ObjectListi.SurfNum) );ObjectListi.surflist = (SURFACE *)malloc( sizeof(SURFACE) * ObjectListi.SurfNum); for(j = 0; j ObjectListi.SurfNum; j + )/* Read surface infor */fscanf( f

50、p, %s, stemp); while( strcmp( stemp,Te*tureId ) != 0) fscanf(fp,%s,stemp); fscanf( fp, %d, &(ObjectListi.surflistj.te*Id) );fscanf( fp, %s, stemp); while( strcmp( stemp,pointnum ) != 0) fscanf(fp,%s,stemp); fscanf( fp, %d, &(ObjectListi.surflistj.pointn) );fscanf( fp, %s, stemp); while( strcmp( stem

51、p,triangle ) != 0) fscanf(fp,%s,stemp); fscanf( fp, %d, &(ObjectListi.surflistj.triangle) );fscanf( fp, %s, stemp); while( strcmp( stemp,quadrangle ) != 0) fscanf(fp,%s,stemp); fscanf( fp, %d, &(ObjectListi.surflistj.quadric) );/* Read point list */ObjectListi.surflistj.pointlist = (POINT3D*)malloc(

52、sizeof(POINT3D) * ObjectListi.surflistj.pointn);plist = ObjectListi.surflistj.pointlist;for( l = 0; l ObjectListi.surflistj.pointn ; l + )fscanf( fp, %f%f%f%f%f%f%f%f, &(plistl.r), &(plistl.g), &(plistl.b), &(plistl.u), &(plistl.v),&(plistl.*), &(plistl.y), &(plistl.z) );/* Read patchlist */nAllVert

53、e*Num = ObjectListi.surflistj.triangle * 3 + ObjectListi.surflistj.quadric *4 ;ObjectListi.surflistj.patchlist = (INT4U *)malloc( sizeof(INT4U) * nAllVerte*Num);pchlist = ObjectListi.surflistj.patchlist;for( l = 0; l nAllVerte*Num; l + )fscanf( fp, %ld, &(pchlistl) ); fclose(fp); void CRenderView:In

54、itLookAt() FILE*fp; strcpy(sLookAtFN,room.lk); fp = fopen(sLookAtFN, rb); if (fp = NULL) e* = ey = ez =1.0f;c* = cy = cz =0.0f;Near = 0.1f;angle = 30.0f; elsefscanf(fp, %f%f%f%f%f%f%f%f, &angle, &Near, &e*, &ey, &ez, &c*, &cy, &cz); fclose(fp);voidCRenderView:InitRenderWin() glShadeModel ( GL_SMOOTH

55、 ); glDepthFunc ( GL_LESS ); glEnable ( GL_DEPTH_TEST ); glMatri*Mode ( GL_PROJECTION ); glLoadIdentity(); glMatri*Mode ( GL_MODELVIEW ); glLoadIdentity(); gluPerspective ( angle, (float)WinWidth/(float)WinHeigth, Near, 1000000000.0); gluLookAt( e*, ey, ez, c*, cy, cz, 0.0, 1.0, 0.0); voidCRenderVie

56、w:Render(void) int i, j, k, l, m, Te*Inde*; 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 0 )InitTe*( Te*Inde* );plist = ObjectListi.surflistj.pointlist;pchlist = ObjectListi.surflistj.patchlist;l = 0;f

57、or ( k = 0; k ObjectListi.surflistj.triangle; k +)glBegin( GL_TRIANGLES );for( m = 0; m 3; m + ) glColor3f ( plistpchlistl.r, plistpchlistl.g, plistpchlistl.b ); glTe*Coord2f( plistpchlistl.u, plistpchlistl.v );glVerte*3f( plistpchlistl.*,plistpchlistl.y,plistpchlistl.z ); l +;/* m */glEnd();/* k */

58、for ( k = 0; k ObjectListi.surflistj.quadric; k +)glBegin( GL_QUADS );for( m = 0; m 4; m + ) glColor3f ( plistpchlistl.r,plistpchlistl.g, plistpchlistl.b );glTe*Coord2f( plistpchlistl.u,plistpchlistl.v ); glVerte*3f( plistpchlistl.*, plistpchlistl.y, plistpchlistl.z ); l +;/* m */glEnd();/* k */glFl

59、ush();CloseTe*();void CRenderView:freelist()int i, j;for( i=0; iObjectNum; i+)for( j=0; jObjectListi.SurfNum; j+)free(ObjectListi.surflistj.pointlist);free(ObjectListi.surflistj.patchlist);free( ObjectListi.surflist ); free(ObjectList);for(i=1; ifname);/* load a image */ fp = fopen(ImageName,rb); if

60、(!fp) return 0; fseek(fp,18L,0); rc=fread(&width,sizeof(long),1,fp); rc=fread(&height,sizeof(long),1,fp);*rsl*=src*=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(src*srcy

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论