OPENGL实验五
- 格式:doc
- 大小:964.50 KB
- 文档页数:18
opengl实验报告OpenGL实验报告引言:OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,被广泛应用于计算机图形学、游戏开发和科学可视化等领域。
本实验报告将介绍我对OpenGL的实验研究和学习成果。
一、实验目的本次实验的主要目的是掌握OpenGL的基本概念和使用方法,了解图形渲染的原理和过程,以及学习如何在OpenGL中创建和操作图形对象。
二、实验环境本次实验使用的是OpenGL的最新版本,并在Windows操作系统下进行开发。
使用的开发工具是Visual Studio和OpenGL的开发库。
三、实验过程1. 熟悉OpenGL的基本概念在开始实验之前,我先学习了OpenGL的基本概念,包括OpenGL的坐标系统、图形渲染管线、着色器等。
了解这些概念对于后续的实验非常重要。
2. 创建窗口和上下文在OpenGL中,我们需要先创建一个窗口和一个OpenGL上下文,以便进行图形渲染。
通过调用相关的OpenGL函数,我成功创建了一个窗口,并初始化了OpenGL的上下文。
3. 绘制基本图形接下来,我开始尝试绘制一些基本的图形,比如点、线和三角形。
通过设置顶点坐标和颜色,我成功绘制出了这些基本图形,并在窗口中显示出来。
4. 添加纹理为了使图形更加逼真和丰富,我学习了如何在OpenGL中添加纹理。
通过加载图片并设置纹理坐标,我成功将纹理贴在了绘制的图形上,使其具有了更加真实的效果。
5. 光照和阴影效果为了增加图形的立体感和真实感,我学习了如何在OpenGL中添加光照和阴影效果。
通过设置光源的位置和属性,以及材质的属性,我成功实现了光照和阴影的效果,使图形看起来更加逼真。
6. 动画效果为了使图形具有动态效果,我学习了如何在OpenGL中实现简单的动画效果。
通过每帧更新顶点的位置和纹理坐标,我成功实现了图形的旋转和平移动画,使其具有了动态的效果。
四、实验结果和分析通过以上的实验过程,我成功掌握了OpenGL的基本概念和使用方法,并实现了一些基本的图形渲染效果。
目录实验一中点算法 (2)一、实验目的和要求 (2)二、主要算法描述 (2)三、代码实现 (4)四、实验结果 (7)实验二Bezier曲线画茶壶 (11)一、实验目的和要求 (11)二、主要算法描述 (11)三、代码实现 (12)四、实验结果 (15)心得体会: (16)实验一 中点算法一、实验目的和要求学习使用OpenGL ,初步了解基本的OpenGL 编程方法。
熟练掌握中点算法,知道如何运用中点算法编程绘制直线、椭圆和圆。
编制中点画圆程序,上机实现在给定条件下下用中点算法画出圆形。
二、主要算法描述试验设计思路:圆是一个八分对称的图形,因此在计算圆上像素点的坐标时,可以只计算八分之一个圆,再依照对称原理算出其他七段的像素点(如下图)。
设圆方程的隐函数表示为 类似于中点法绘制直线的原理,我们将平面点划分为圆内和圆外(如下图):圆弧外的点:F(X ,Y)>0;圆弧内的点:F(X ,Y)<0;),(222=-+=R y x y x F假设在),(i i y x 绘制了一个像素,则下一步必须确定像素位置是),1(i i y x +还是)1,1(-+i i y x 更接近圆。
一次由两个点的中点决定,若中点)21,1(-+i i y x 在圆内,则说明)1,1(-+i i y x 更接近圆,否则说明),1(i i y x +更接近圆(如下图)。
为了在计算中避开计算圆的方程时会遇到的平方与开方,故运用迭代方法由式1211++=++i i i x p p 与111212+++-++=i i i i y x p p 计算决定参数。
试验编程思路:1. 输入圆半径r 和圆心),(c c y x ,并得到圆周(圆心在原点)上的第一个点:),0(),(00r y x =2. 计算决策参数的初值:r p -=103. 在每个k x 位置,从0=k 开始,完成下列测试:加入0<k p ,圆心在原点的下一个点位),(1k k y x +,并且1211++=++k k k x p p否则,圆的下一个点是)1,1(-+k k y x ,并且111212+++-++=k k k k y x p p其中11+=+k k x x 且11-=+k k y y4.确定其他七个八分圆中的对称点。
实验1,opengl的基本语法实验报告心得体会实验1,opengl的基本语法实验报告心得体会篇一:图形学实验报告openGL的基本语法《计算机图形学基础》实验1 OpenGL的基本语法一、实验目的及要求1. 了解OpenGL的主要功能2. 了解OpenGL的绘制流程3. 掌握OpenGL的基本语法4. 通过以上内容,掌握 OpenGL的编程框架,实现简单的图形绘制二、实验环境主要是软件开发环境:VC三、实验内容OpenGL绘制矩形的简单例子。
四、实验结果五、程序代码#includevoid Initial(void){}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口glColor3f(, , );//设置当前的绘图颜色为红色glRectf(, , , ); //绘制一个矩形glFlush();//处理所有的OpenGL程序}int main(int argc, char* argv[]){glutInit(&argc, argv); glutInitDisplayMo(转载于: 小龙文档网:实验1,opengl的基本语法实验报告心得体会)de(GLUT_SINGLE | GLUT_RGB); //初始化glClearColor(, , , ); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//设置投影参数gluOrtho2D(,,,); 窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口的位置}glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //启动主GLUT事件处理循环return 0;六、心得体会。
学生实验实习报告册学年学期:2016-2017学年 春□√秋学期课程名称:大学计算机基础学生学院:通信与信息工程学院专业班级:学生学号:学生姓名:联系电话:重庆邮电大学教务处印制实验实习名OpenGL基本使用指导教师秦红星考核成绩课程名称计算机图形学A 课程编号实验实习地点信息科技大厦S306 完成日期学生姓名学生学号学院专业广电与数字媒体类所在班级教师评语教师签名:年月日一、实验实习目的及要求目的:认识了解OpenGL的性质、功能要求:1.利用OpenGL绘制一个简单的场景:比如球体、正方体2.加入灯光3.实现交互操作:平移、缩放、旋转二、实验实习设备(环境)及要求(软硬件条件)采用Microsoft Visual C 2010生成环境并用C++编写程序三、实验实习内容与步骤内容:背景为黑色,在点光源下,能够实现平移、缩放、旋转的球。
步骤:建立立体-->添加光照-->添加变换1.先写“主函数”,在主函数中将窗口生成好。
2.在“自定义函数1”中对窗口进行清除、填色等操作。
3.在“自定义函数1”中设置点光源,设置光照的各种参数。
4.在“自定义函数1”中设置平移、缩放、旋转及各参数。
5.在“自定义函数2”中设置平移和缩放的循环。
6.在主函数中调用这两个自定义函数,并且在主函数里面用“自定义函数1”为参数调用glutDisplayFunc()来注册一个绘图函数。
其次用空闲回调函数glutIdleFunc()来使球体不停地循环有缩放、平移功能的函数。
实现动画。
四、实验实习过程或算法(源程序、代码)#include<GL/glut.h>GLfloat angle = 0.0f;GLfloat multiply = 0.0f;void display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置窗口里面的背景颜色glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);glLoadIdentity();gluLookAt(0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);{//设置一个点光源GLfloat light_position[] = { 0.5f,0.0f,0.0f,1.0f };//(xyzw)w为1时代表点光源,0时代表方向光源GLfloat light_ambient[] = { 0.5f,0.5f,0.5f,1.0f };//(0001)GLfloat light_diffuse[] = { 1.0f,1.0f,1.0f,1.0f };//(1111)GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };//(1111)glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);//光源环境光强值glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);//光源漫反射强值glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);//光源镜面反射强值glEnable(GL_LIGHT0);//打开该光源glEnable(GL_LIGHTING);//打开光照}{glRotatef(angle, 0.0f, 1.0f, 0.0f);glTranslatef(0.0f, 0.0f, 0.6f); //平移glScaled(multiply, multiply, multiply); //缩放glutSolidSphere(0.2, 50, 50);}glutSwapBuffers();}void rotateAndzoom(void) //旋转和缩放{angle += 1.0f;if (angle >= 360.0f)angle = 0.0f;display();//设置旋转multiply += 0.01f;if (multiply >= 2.0f)// multiply -= 0.01f;//if (multiply <= 1.0f)multiply = 1.0f;display();//设置缩放}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);glutInitWindowPosition(400, 50);glutInitWindowSize(800, 800);glutCreateWindow("立体");glutDisplayFunc(&display);glutIdleFunc(&rotateAndzoom);//旋转glutMainLoop();//调用该函数启动程序,所有以创建的窗口将会显示return 0;}五、实验实习结果分析和(或)源程序调试过程实验实习名直线扫面和区域填充实现指导教师考核成绩课程名称课程编号实验实习地点完成日期学生姓名学生学号学院专业通信与信息工程学院广电与数字媒体类所在班级教师评语教师签名:年月日一、实验实习目的及要求项目目的:熟悉光栅图形学中的相关算法项目要求:1.应用OpenGL点绘制函数直线与区域2.采用直线扫面算法绘制一条线段,直线有离散点组成3.利用区域填充算法绘制多边形区域,区域由离散点组成二、实验实习设备(环境)及要求(软硬件条件)采用Microsoft Visual C 2010生成环境并用C++编写程序三、实验实习内容与步骤内容:1.用DDA算法实现点绘制直线。
《高级计算机图形学》实验报告姓名:学号:班级:【实验报告要求】实验名称:高级计算机图形学室内场景实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。
实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。
要求使用到光线跟踪算法、纹理映射技术以及实时绘制技术。
一、实验效果图图1:正面效果图图2:背面效果图图4:背面效果图图4:室内场景细节效果图图5:场景角度转换效果图二、源文件数据代码:共6个文件,其实现代码如下:1、DlgAbout.cpp#include "StdAfx.h"#include "DlgAbout.h"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 "stdafx.h"#include "Tool.h"#include "MainFrm.h"#include "FormCommandView.h"#include "ToolDoc.h"#include "RenderView.h"// Download by #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// CFormCommandViewIMPLEMENT_DYNCREATE(CFormCommandView, CFormView)CFormCommandView::CFormCommandView(): CFormView(CFormCommandView::IDD){//{{AFX_DATA_INIT(CFormCommandView)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_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////// ////// CFormCommandView diagnostics#ifdef _DEBUGvoid CFormCommandView::AssertValid() const{CFormView::AssertValid();}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// OnPaintvoid CFormCommandView::OnPaint(){// Device context for paintingCPaintDC dc(this);// Options are stored in ApplicationCToolApp *pApp = (CToolApp *)AfxGetApp();CRect rect;// Color backm_ControlBackColor.GetWindowRect(&rect);ScreenToClient(&rect);CBrush BrushBack(pApp->m_OptionColorGlBack);dc.FillRect(&rect,&BrushBack);}// OnLButtonUpvoid CFormCommandView::OnLButtonUp(UINT nFlags,CPoint point){CRect rect;CToolApp *pApp = (CToolApp *)AfxGetApp();// Option back colorm_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);}// GetRenderViewCView *CFormCommandView::GetRenderView(){CToolApp *pApp = (CToolApp *)AfxGetApp();CMainFrame *pFrame = (CMainFrame *)pApp->m_pMainWnd;CView *pView = (CView *)pFrame->m_wndSplitter.GetPane(0,1);return pView;}// Modelvoid CFormCommandView::OnRadioModel1(){glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);this->GetRenderView()->InvalidateRect(NULL,FALSE);}void CFormCommandView::OnRadioModel2(){glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);this->GetRenderView()->InvalidateRect(NULL,FALSE); }// OnCheckSmoothvoid CFormCommandView::OnCheckSmooth(){m_Smooth = !m_Smooth;if(m_Smooth)glShadeModel(GL_SMOOTH);elseglShadeModel(GL_FLAT);this->GetRenderView()->InvalidateRect(NULL,FALSE);}// OnCheckAntialias// Toggle antialiased linesvoid 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);}GetRenderView()->InvalidateRect(NULL,FALSE);}3、MainFrm.cpp#include "stdafx.h"#include "Tool.h"// Download by #include "MainFrm.h"#include "FormCommandView.h"#include "RenderView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// CMainFrameIMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_WM_PAINT()//}}AFX_MSG_MAPEND_MESSAGE_MAP()static UINT indicators[] ={ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,};// CMainFrame construction/destruction CMainFrame::CMainFrame(){}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("Failed to create toolbar\n");return -1; // fail to create}if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create status bar\n");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 _DEBUGvoid CMainFrame::AssertValid() const{CFrameWnd::AssertValid();}void CMainFrame::Dump(CDumpContext& dc) const{CFrameWnd::Dump(dc);}#endif //_DEBUG// CMainFrame message handlersvoid 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("Failed to CreateStaticSplitter\n");return FALSE;}// First splitter paneif (!m_wndSplitter.CreateView(0, 0,RUNTIME_CLASS(CRenderView), CSize(600,500), pContext)){TRACE("Failed to create command view pane\n");return FALSE;}if (!m_wndSplitter.CreateView(0, 1,RUNTIME_CLASS(CFormCommandView), CSize(0,0), pContext)){TRACE("Failed to create command view pane\n");return FALSE;}// Second splitter panereturn TRUE;}4、RenderView.cpp#include "stdafx.h"#include "Tool.h"#include <string.h>#include <time.h>#include <math.h>#include "ToolDoc.h"#include "RenderView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifextern 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.int oldmx = 0, oldmy = 0, mb;// CRenderViewIMPLEMENT_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 commandsON_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/destructionCRenderView::CRenderView(){// OpenGLm_hGLContext = NULL;m_GLPixelIndex = 0;// Mousem_LeftButtonDown = FALSE;m_RightButtonDown = FALSE;m_CursorRotation = AfxGetApp()->LoadCursor(IDC_CURSOR_ROTATION);// ColorsCToolApp *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//============================================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);}// CRenderView drawingvoid 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 _DEBUGvoid 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;}#endif //_DEBUG// Create OpenGL rendering contextint 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 modeglPolygonMode(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 definitionInitGeometry();glEnable(GL_TEXTURE_2D);glDisable(GL_LIGHTING);return 0;}BOOL CRenderView::SetWindowPixelFormat(HDC hDC){PIXELFORMATDESCRIPTOR pixelDesc;pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);pixelDesc.nVersion = 1;pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_STEREO_DONTCARE;pixelDesc.iPixelType = PFD_TYPE_RGBA;olorBits = 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;return TRUE;}// Create an OpenGL rendering contextBOOL 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 contextvoid 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 modeCSize size(cx,cy);double aspect;aspect = (cy == 0) ? (double)size.cx : (double)size.cx/(double)size.cy;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);}void CRenderView::OnPaint(){// Device context for paintingCPaintDC dc(this);// Useful in singledoc templatesHWND 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 buffersSwapBuffers(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;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,"room.ed");fp = fopen( gEnergyFile, "r" );if ( fp == NULL ){printf( "\n Can not open energy data file:%s\n", gEnergyFile); exit(0);}fseek( fp, 0, SEEK_SET);/****** read texture list ******/fscanf( fp, "%s", stemp);while( strcmp( stemp,"texnum" ) != 0) fscanf( fp, "%s", stemp);fscanf( fp, "%d", &texnum );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, "%s%s", TextureList[i]->fname, stemp );if ( strcmp( stemp,"REPEAT_TEXTURE" ) == 0)TextureList[i]->type = 1;else if ( strcmp( stemp,"CLAMP_TEXTURE" ) == 0)TextureList[i]->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; i < ObjectNum; i ++ ){f scanf( fp, "%s", stemp);w hile( strcmp( stemp,"SurfaceNum" ) != 0) fscanf(fp,"%s",stemp);f scanf( fp, "%ld", &(ObjectList[i].SurfNum) );ObjectList[i].surflist = (SURFACE *)malloc( sizeof(SURFACE) * ObjectList[i].SurfNum);for(j = 0; j < ObjectList[i].SurfNum; j ++ ){/****** Read surface infor ******/fscanf( fp, "%s", stemp);while( strcmp( stemp,"TextureId" ) != 0) fscanf(fp,"%s",stemp);fscanf( fp, "%d", &(ObjectList[i].surflist[j].texId) );fscanf( fp, "%s", stemp);while( strcmp( stemp,"pointnum" ) != 0) fscanf(fp,"%s",stemp);fscanf( fp, "%d", &(ObjectList[i].surflist[j].pointn) );fscanf( fp, "%s", stemp);while( strcmp( stemp,"triangle" ) != 0) fscanf(fp,"%s",stemp);fscanf( fp, "%d", &(ObjectList[i].surflist[j].triangle) );fscanf( fp, "%s", stemp);while( strcmp( stemp,"quadrangle" ) != 0) fscanf(fp,"%s",stemp);fscanf( fp, "%d", &(ObjectList[i].surflist[j].quadric) );/****** 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, "%f%f%f%f%f%f%f%f",&(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;for( l = 0; l < nAllVertexNum; l ++ )fscanf( fp, "%ld", &(pchlist[l]) );}}fclose(fp);}void CRenderView::InitLookAt(){FILE *fp;strcpy(sLookAtFN,"room.lk");fp = fopen(sLookAtFN, "rb");if (fp == NULL){ex = ey = ez =1.0f;cx = cy = cz =0.0f;Near = 0.1f;angle = 30.0f;}else fscanf(fp, "%f%f%f%f%f%f%f%f", &angle, &Near, &ex, &ey, &ez, &cx, &cy, &cz);fclose(fp);}void C RenderView::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);}void C RenderView::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 ++){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<ObjectNum; i++){for( j=0; j<ObjectList[i].SurfNum; j++){free(ObjectList[i].surflist[j].pointlist);free(ObjectList[i].surflist[j].patchlist);}free( ObjectList[i].surflist );}free(ObjectList);for(i=1; i<=texnum; i++)free(TextureList[i]);free(TextureList);}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,"rb");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<srcx; i++) {for(j=0; j<srcy; j++) {(unsigned char)*(SImageData+i*srcx*3+j*3+0) = (unsignedchar)*(image+i*srcx*3+j*3+2);(unsigned char)*(SImageData+i*srcx*3+j*3+1) = (unsigned char)*(image+i*srcx*3+j*3+1);(unsigned char)*(SImageData+i*srcx*3+j*3+2) = (unsigned char)*(image+i*srcx*3+j*3+0);}}free(image);printf("%s : %ld=%ld\n", ImageName, srcx*srcy*3,i*j*3);return( SImageData );}/********************************//* function : InitTex *//********************************/void C RenderView::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{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 C RenderView::CloseTex(){glDisable(GL_TEXTURE_2D);}void CRenderView::LoadAllTexture(){int i;for (i=0; i <texnum ; i++)ImageDatas[i] = OpenTexImage( i+1, &rslxs[i], &rslys[i] );}void CRenderView::FreeAllTexture(){int i;for (i=0; i <texnum ; i++)free(ImageDatas[i]);}5、StdAfx.cpp#include "stdafx.h"6、Tool.cpp#include "stdafx.h"#include "Tool.h"#include "DlgAbout.h"#include "MainFrm.h"#include "ToolDoc.h"#include "RenderView.h"// Download by #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// CToolAppCToolDoc *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 commandON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()// CToolApp constructionCToolApp::CToolApp(){// Optionsm_OptionColorGlBack = RGB(0,0,255);}// The one and only CToolApp objectCToolApp theApp;// CToolApp initializationBOOL CToolApp::InitInstance(){AfxEnableControlContainer();// Standard initialization// 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 _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL#elseEnable3dControlsStatic(); // 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("3D Toolbox"));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 windowCMainFrame* 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();return TRUE;}// App command to run the dialogvoid CToolApp::OnAppAbout(){CAboutDlg aboutDlg;aboutDlg.DoModal();}6、ToolDoc.cpp#include "stdafx.h"#include "math.h"#include "Tool.h"#include "ToolDoc.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifIMPLEMENT_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_MAPEND_MESSAGE_MAP()extern CToolApp theApp;// CToolDoc construction/destruction。
计算机图形学综合实验报告烟台大学计算机学院软件工程专业班级:计103-3学号:201058503334姓名:公茂华指导教师:孔繁茹完成日期:2012.11.10综合试验:太阳系模型一、实验目的与要求1、学习和掌握OpenGL的使用2、掌握矩阵堆栈的实现方法3、根据自己的创意实现实验内容,进一步掌握和理解OpenGL的使用二、实验内容1、请编写地球围绕太阳自动旋转的方式2、请再加上一个月亮, 并围绕地球旋转,并添加轨道3、实现用户通过键盘或鼠标加入或减少行星和卫星三、实验结果1、开始运行2、增加地球和月亮(按键L或l)或其他任意行星及其若干卫星3、按照提示用鼠标和键盘增加或减少行星和卫星转换视角:4、异常提示:要将Color.txt文件放到当前文件夹下四、体会通过本次试验的实践,使我更加了解和初步掌握了OpenGL的用法,对使用OpenGl绘制球体等图形有了充分认识,并对平移矩阵堆栈和旋转矩阵堆栈的使用有了初步的掌握。
虽然以前没有接触过OpenGl,但是通过学习计算机图形学这门课程的知识,以及通过多次上机实验,已使我对OpenGL有了一定了解,不过具体使用和其它方面还需要进一步理解和学习。
最后,感谢老师的悉心指导。
五、源程序注:红色注释为新加#include <windows.h>#include <gl/glut.h>#include <stdlib.h>#include <stdio.h>#include <math.h>static float fE = 0.0f; //绕太阳或行星旋转的角度static int i=0, j=0, m; //for循环计数static GLint x=7, y=3; //转换视角,以太阳为中心static int a[8]; //计数第几颗行星的卫星的数量static bool lag = false; //键盘L(l)增加行星的标志,true为增加int k[8][3]; //读取文件数据FILE *fp;void Initial(){glEnable(GL_DEPTH_TEST); //启用深度测试glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色}void Change(int w, int h){glViewport(0, 0, (GLsizei) w, (GLsizei) h);//设置视区尺寸glMatrixMode(GL_PROJECTION); //指定当前操作投影矩阵堆栈glLoadIdentity(); //重置投影矩阵GLfloat fAspect;fAspect = (float)w/(float)h;gluPerspective(45, fAspect, 1.0, 600.0);//设置透视投影矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void Satellite() //增加卫星{for (int n=0; n< a[i]; n++){glPushMatrix();glRotatef(30.0f+6*n, 0.0f, 0.0f, 1.0f); //绕z轴旋转30度glRotatef(fE*10*(3*n+1), 0.0f, 1.0f, 0.0f); //公转速度fE*10*(3*n+1)glTranslated(-5.0f*m, 1.0f, 0.0f);glColor3f(256.0f, 256.0f, 0.0f);glutWireSphere(1.0f, 20, 20); //卫星glColor3f(0.0f, 0.0f, 0.0f);glPopMatrix();}}void Planet() //增加行星{if (lag==true) //键盘L(l)增加行星i=j-1;elsei=0;for (;i<j;i++){if (i<5){if (i==3)m=1.9;//模拟火星elsem=i+1;}elsem=9-i;glPushMatrix(); //保存当前的模型视图矩阵glColor3f(0,0,9);glutWireTorus(20.0f*(i+1), 0, 100, 1); //轨道glRotatef(fE*(9-i), 0.0f, 1.0f, 0.0f); //绕y轴旋转一定的角度glTranslated(20.0f*(i+1), 0.0f, 0.0f); //平移一段距离glColor3f(k[i][0], k[i][1], k[i][2]);glutWireSphere(2.0f*m, 20, 20); //行星glColor3f(0.0f, 0.0f, 0.0f);Satellite();glPopMatrix();}}void Display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//将缓存清除为预先的设置值glMatrixMode(GL_MODELVIEW); //指定当前矩阵glLoadIdentity(); //重置视图矩阵glTranslated(0.0f, 0.0f, -300.0f); //将图形沿z轴负方向移动glRotatef(60.0f, x, y, 0);glColor3f(1.0f, 0.0f, 0.0f);glutWireSphere(16.0f, 20, 20); //太阳半径glColor3f(0.0f, 0.0f, 0.0f);Planet();fE += 1.0f; //增加旋转步长if (fE > 360.0f)fE = 1.0f;glutSwapBuffers();}void Timer(int value){glutPostRedisplay();glutTimerFunc(100,Timer,1); //100毫秒后调用回调函数}void MouseMove(GLint xMouse, GLint yMouse)//以鼠标移动,变换视角{x=xMouse;y=yMouse;}void MousePlot(GLint button, GLint action, GLint xMouse, GLint yMouse){if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)//增加行星{// if (lag==true) //取消键盘L(l)增加的行星,取消的部分// {// lag=false;// a[j-1]=0;// j=-1;// }if (j<8 && lag == false)//最大数量限制{a[j]=0;j++;}}if (button == GLUT_RIGHT_BUTTON && action == GLUT_DOWN)//减少行星{if (lag==true) //取消键盘L(l)增加的行星{lag=false;a[j-1]=0;j=0;}if (j>0) //最少数量限制{j--;a[j] = 0;}}}void Keyboard(unsigned char key, int x, int y){switch(key){case 'q': //增加卫星if (a[0]<1) //最大限制a[0]++;break;case 'Q': //减少卫星if (a[0]>0) //最小限制a[0]--;break;case 'w':if (a[1]<2)a[1]++;break;case 'W':if (a[1]>0)a[1]--;break;case 'e':if (a[2]<5)a[2]++;break;case 'E':if (a[2]>0)a[2]--;break;case 'r':if (a[3]<7)a[3]++;break;case 'R':if (a[3]>0)a[3]--;break;case 'a':if (a[4]<8)a[4]++;break;case 'A':if (a[4]>0)a[4]--;break;case 's':if (a[5]<6)a[5]++;break;case 'S':if (a[5]>0)a[5]--;break;case 'd':if (a[6]<4)a[6]++;break;case 'D':if (a[6]>0)a[6]--;break;case 'f':if (a[7]<3)a[7]++;break;case 'F':if (a[7]>0)a[7]--;break;case 'l': // L(l)键case 'L':lag = true;printf("1、水星 2、金星 3、地球 4、火星 5、木星 6、土星 7、天王星 8、海王星\n");printf("请输入行星代号:");scanf("%d", &j);if(j<1 || j>8)exit(0);printf("请输入卫星数量(不小于0,不大于12):");scanf("%d", &a[j-1]);if(a[j-1]<0 || a[j-1]>12)//控制卫星数量exit(0);printf("转换视角时,按下鼠标不动!\n");break;case 27: //退出ESCexit(0);break;default:break;}}int main(int argc, char * argv[]){printf("太阳系模型按键操作:\n\t1、鼠标左键增加行星数量,右键减少行星数量;\n\t");printf("2、键盘q、w、e、r、a、s、d、f依次增加行星的卫星;\n\t");printf("3、键盘Q、W、E、R、A、S、D、F依次减少行星的卫星;\n\t");printf("4、键盘L(l)可以增加任意一个指定行星及其若干卫星;\n\t");printf("5、鼠标右键取消第4步操作!\n\t");printf("转换视角时,按下鼠标左键移动!\n");Sleep(2000);if (NULL == (fp = fopen("Color.txt", "r")))//读取颜色信息{printf("file not open or file not exist!\n");Sleep(1000);exit(0);}for(int q =0; q<8; q++)for (int ii=0; ii<3; ii++)fscanf(fp, "%d", &k[q][ii]);//fp文件指针fclose(fp);glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(1000, 700);glutInitWindowPosition(10, 10);glutCreateWindow("太阳系简单模型");glutReshapeFunc(Change);glutDisplayFunc(Display);glutKeyboardFunc(Keyboard);glutMouseFunc(MousePlot);glutMotionFunc(MouseMove);glutTimerFunc(500, Timer, 1);//制定定时器回调函数Initial();glutMainLoop();return 0;}。
计算机图形学实验指导书计算机科学与信息工程学院目录实验一OpenGL程序设计 (3)实验二二维基本图元的生成 (7)实验三二维图元的填充 (13)实验四二维图形的几何变换 (18)实验五裁剪 (23)实验六自由曲线 (26)实验七造型技术 (27)实验八交互式技术 (32)实验九真实感图形的绘制 (37)计算机图形学实验指导一、实验目的1、培养学生动手编程解决实际问题的能力。
2、训练学生分析问题和调试程序的能力。
3、锻炼学生撰写科技实验论文的能力。
二、实验要求1、问题分析充分地分析和理解问题本身,弄清要求做什么,用什么算法。
2、程序设计(1)根据所采用的算法,设计数据结构,画出流程图并编程。
(2)最后准备调试程序的数据及测试方案。
3、上机调试(1)对程序进行编译,纠正程序中可能出现的语法错误。
(2)调试前,先运行一遍程序看看究竟将会发生什么。
(3)如果情况很糟,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试、设置观察窗输出中间变量值等手段。
4、整理实习报告三、实验报告1、实验内容:采用的算法名称2、问题描述:包括目标、任务、条件约束描述等。
3、设计:数据结构设计和核心算法设计。
主要功能模块的输入,处理(算法框架)和输出。
4、测试范例:测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。
5、心得:包括程序的改进设想,经验和体会。
6、程序清单:源程序,其中包括变量说明及详细的注释。
实验一OpenGL程序设计一、实验学时2学时二、实验类型学习型实验三、实验目的和要求初步了解OpenGL程序设计结构;了解OpenGL的基本数据类型、核心函数及辅助函数的使用。
四、实验内容1、综述这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。
OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。
计算机图形学实验——利⽤OpenGL函数绘制五⾓星⼀、实验名称:五⾓星的绘制⼆、实验⽬的:了解 OpenGL 程序设计结构,掌握编程环三、境的设置,掌握绘制线段的⽅法。
四、实验内容:1.在 VC++ 环境下,练习利⽤ OpenGL 绘制三⾓形的程序。
2.编程实现绘制⼀个五⾓星。
(传统 OpenGL 或者 Shader)五、实验所需基本函数1.线段绘制glBegin(GL_LINES);//绘制参数GL_LINESglVertex2f(30,30);//起始点坐标glVertex2f(100,100);//终点坐标(两个为⼀组)glEnd();2.填充图像glBegin(GL_POLYGON);//绘制参数GL_POLYGONglVertex2f(x0, y0);//顶点坐标1glVertex2f(x1, y1);//2glVertex2f(cx, cy);//3glEnd();结果为对三个顶点组成的图像进⾏填充3.绘制颜⾊设置glColor3f(0.92, 0.89, 0.41);//⾦黄⾊六、实验原理根据⼩圆半径加⾓度算出第⼀个坐标然后⼤圆根据半径加⼀个⾓度算出第⼆个点坐标,然后旋转改变⾓度寻找所有顶点。
代码如下:1void DrawStar(float cx, float cy, float R,float r,float o)//五⾓星中⼼坐标x,y,⼤圆半径,⼩圆半径,初始⾓度2 {34float x0, y0, x1, y1;//5float o0 = o;//⼤圆对应⾓度6float o1 = o + 0.2 * 3.14;//⼩圆对应⾓度7for (int i = 0;i <10;i++)8 {9 x0 = cx+R * cos(o0);//⼤圆对应的x坐标10 y0 = cy+R * sin(o0);//⼤圆对应y坐标11 x1 = cx+r * cos(o1);//⼩圆对应x坐标12 y1 = cy+r * sin(o1);//⼩圆对应y坐标13if (i % 2 == 0)14 {15 glColor3f(1, 0, 0);16 }17else18 {19 glColor3f(0.92, 0.89, 0.41);20 }2122 glBegin(GL_POLYGON);//绘制23 glVertex2f(x0, y0);24 glVertex2f(x1, y1);25 glVertex2f(cx, cy);26 glEnd();27if (i % 2 == 0)28 {29 o0 = o0 + 0.4 * 3.14;//⼤圆对应⾓度变换30 }31else32 {33 o1 = o1 + 0.4 * 3.14;//⼩圆对应⾓度变换34 }3536 }37383940 }七、绘制结果⼋、附件所有代码1// OpenGLOld.cpp : 定义控制台应⽤程序的⼊⼝点。
关于opengl实验报告OpenGL实验报告一、实验目的本实验旨在通过使用OpenGL图形库,掌握基本的3D图形编程技术,以及了解OpenGL的基本操作和常用函数。
二、实验环境1. 操作系统:Windows 102. 开发环境:Visual Studio 20193. 编程语言:C++4. 图形库:OpenGL三、实验内容1. 创建一个窗口并初始化OpenGL环境2. 绘制一个简单的三维立方体3. 添加光照效果和材质4. 实现简单的相机控制5. 添加纹理贴图四、实验过程1. 创建窗口并初始化OpenGL环境首先,我们使用OpenGL提供的函数来创建一个窗口,并初始化OpenGL环境。
这一步是整个实验的基础,也是我们能够进行后续操作的前提。
2. 绘制一个简单的三维立方体利用OpenGL提供的函数,我们可以很容易地绘制一个简单的三维立方体。
通过设置顶点坐标和法向量,我们可以使用OpenGL提供的函数来绘制出一个立方体。
3. 添加光照效果和材质在绘制立方体的基础上,我们可以通过设置光源的位置和颜色,以及物体的材质属性,来实现光照效果和材质的渲染。
这一步可以让我们的立方体看起来更加真实。
4. 实现简单的相机控制通过控制相机的位置和方向,我们可以实现简单的相机控制。
这样可以让我们在3D场景中自由地移动和观察物体。
5. 添加纹理贴图最后,我们可以通过加载纹理图片,并将其贴到立方体的表面上,来实现纹理贴图。
这样可以让我们的立方体看起来更加生动和具有真实感。
五、实验总结通过本次实验,我们学习了如何使用OpenGL图形库进行3D图形编程,掌握了基本的操作和常用函数。
同时,我们也实现了一个简单的3D场景,包括绘制立方体、添加光照效果和材质、实现相机控制以及添加纹理贴图。
这些技术和知识对于今后的图形编程工作将会有很大的帮助。
学院专业班学号姓名:教师评定:功能说明:1.按W 键缩小视图2.按S 键放大视图3.按鼠标右键调出菜单(可选“线条”或“填充”,和开启转动)4.按定鼠标左键可以任意角度调节视角5.按+ 键风车加速6.按- 键风车减速主程序:#include <stdlib.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h>#pragma comment(lib,"glaux.lib") //将glaux.lib连接到工程GLuint g_TexturesArray[2];//纹理指针enum //枚举鼠标变量{BUTTON_LEFT ,//鼠标左键};int mButton = -1;int mOldY, mOldX;float eye[3] = {0.0f, 0.0f, 10.0f}; //观察视角float rot[3] = {45.0f, 45.0f, 0.0f}; //旋转变量float c,z,a=0.05;int n;int iMode=1;void ProcessMenu(int value)//弹出处理函数{iMode=value;glutPostRedisplay();//强制刷新显示}void CreatePopMenu()//生成弹出式菜单函数{int nMainMenu;//主菜单变量int SubMenu1,SubMenu2,SubMenu3;//子菜单变量//创建子菜单1SubMenu1=glutCreateMenu(ProcessMenu);//生成一个子菜单并指定菜单处理函数glutAddMenuEntry("按S键放大图像",0);//添加子菜单项1glutAddMenuEntry("按W键缩小图像",0);//添加子菜单项2glutAddMenuEntry("按+键风车加速",0);//添加子菜单项3glutAddMenuEntry("按-键风车减速",0);//添加子菜单项4glutAddMenuEntry("按鼠标左键任意调节视角",0);//添加子菜单项5//创建子菜单2SubMenu2=glutCreateMenu(ProcessMenu);//生成一个子菜单并指定菜单处理函数glutAddMenuEntry("开启",2);//添加子菜单项6glutAddMenuEntry("关闭",1);//添加子菜单项7//创建子菜单3SubMenu3=glutCreateMenu(ProcessMenu);//生成一个子菜单并指定菜单处理函数glutAddMenuEntry("填充",3);//添加子菜单项8glutAddMenuEntry("线条",4);//添加子菜单项9//创建主菜单nMainMenu=glutCreateMenu(ProcessMenu);//生成一个主菜单并指定菜单处理函数glutAddSubMenu("键盘功能说明",SubMenu1);//将上面生成的子菜单添加到主菜单中glutAddSubMenu("旋转",SubMenu2);//将上面生成的子菜单添加到主菜单中glutAddSubMenu("模式",SubMenu3);//将上面生成的子菜单添加到主菜单中glutAttachMenu(GLUT_RIGHT_BUTTON);//指定激活菜单的鼠标按键}bool LoadBMP(char *filename, GLuint &texture) //调贴图大小为2的幂{AUX_RGBImageRec *pImage = NULL;pImage = auxDIBImageLoad(filename); // 装入位图if(pImage == NULL) return false; // 位图没装入返回错误glGenTextures(1, &texture); // 生成贴图(纹理)glBindTexture (GL_TEXTURE_2D,texture);// 捆绑贴图(纹理)gluBuild2DMipmaps(GL_TEXTURE_2D,4, //建立图形pImage->sizeX, // 图形宽pImage->sizeXpImage->sizeY, // 图形高pImage->sizeY,GL_RGB, GL_UNSIGNED_BYTE,pImage->data // 图形数据);free(pImage->data); // 释放位图数据占据的内存资源free(pImage);return true; // 返回成功}void Init(){glEnable(GL_DEPTH_TEST); //开启深度缓冲glEnable(GL_TEXTURE_2D); //启用二维文理//----------------载入图片--------------LoadBMP("data/1.bmp",g_TexturesArray[0]);}void glutResize(int width, int height)//重置OpenGL窗口大小{glViewport(0, 0, width, height); //重置当前视口glMatrixMode(GL_PROJECTION); //选择投影矩阵glLoadIdentity(); //重置投影矩阵gluPerspective(45.0, (float)width/(float)height, 1.0, 300.0);//设置视口大小}void yancong()//烟囱零件{glBegin(GL_QUADS);glColor3f(0.7,0.5,0.5);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.05,1.3,0.05);glTexCoord2f(1.0f, 0.0f);glVertex3f(0.05,0.8,0.05);glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.05,0.8,0.05);glTexCoord2f(0.0f, 1.0f);glVertex3f(-0.05,1.3,0.05);glEnd();}void funnel()//烟囱{glPushMatrix();glTranslatef(0.15,0.0,-1.0);yancong();for(int i=1;i<=3;i++){glRotatef(90,0.0,1.0,0.0);yancong();}glPopMatrix();}void window()//四叶窗{glDisable(GL_TEXTURE_2D);glBegin(GL_QUADS);glColor3f(0.4,0.1,0.0);glVertex3f(0.2,0.105,0.001);glVertex3f(0.105,0.105,0.001);glVertex3f(0.105,0.2,0.001);//----------------glVertex3f(0.2,0.095,0.001);glVertex3f(0.2,0.0,0.001);glVertex3f(0.105,0.0,0.001);glVertex3f(0.105,0.095,0.001);//------------------glVertex3f(0.095,0.095,0.001);glVertex3f(0.095,0.0,0.001);glVertex3f(0.0,0.0,0.001);glVertex3f(0.0,0.095,0.001);//---------------------glVertex3f(0.095,0.2,0.001);glVertex3f(0.095,0.105,0.001);glVertex3f(0.0,0.105,0.001);glVertex3f(0.0,0.2,0.001);glEnd();glEnable(GL_TEXTURE_2D);}//-----------------左房子------------void left_house(){glPushMatrix(); //入栈glTranslatef(-0.8,-0.4,0.0);//---------正墙----------glBindTexture(GL_TEXTURE_2D, g_TexturesArray[0]); glBegin(GL_QUADS);glColor3f(1.0,1.0,1.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.4,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.0,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.0); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.4,0.0); glEnd();glPushMatrix(); //入栈glTranslatef(0.0,0.4,0.0);glBegin(GL_QUADS);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.4,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.0,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.0); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.4,0.0);glEnd();glPopMatrix();//出栈//----------左墙-------glPushMatrix(); //入栈glRotatef(90, 0.0f, 1.0f, 0.0f);glBegin(GL_QUADS);glTexCoord2f(1.0f, 1.0f);glVertex3f(1.2,0.4,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(1.2,0.0,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.0); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.4,0.0); glEnd();glTranslatef(0.0,0.4,0.0);glBegin(GL_QUADS);glTexCoord2f(1.0f, 1.0f);glVertex3f(1.2,0.4,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(1.2,0.0,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.0); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.4,0.0); glEnd();glPopMatrix();//出栈//---------后墙----------glPushMatrix(); //入栈glTranslatef(0.0,0.0,-1.2);glBegin(GL_QUADS);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.4,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.0,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.0); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.4,0.0); glEnd();glTranslatef(0.0,0.4,0.0);glBegin(GL_QUADS);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.4,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.0,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.0); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.4,0.0); glEnd();glPopMatrix();//出栈//----------右墙--------------glPushMatrix(); //入栈glTranslatef(0.8,0.0,0.0);glRotatef(90, 0.0f, 1.0f, 0.0f);glBegin(GL_QUADS);glTexCoord2f(1.0f, 1.0f);glVertex3f(1.2,0.4,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(1.2,0.0,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.0);glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.4,0.0); glEnd();glTranslatef(0.0,0.4,0.0);glBegin(GL_QUADS);glTexCoord2f(1.0f, 1.0f);glVertex3f(1.2,0.4,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(1.2,0.0,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.0); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.4,0.0); glEnd();glPopMatrix();//出栈//---------房顶---------------glBegin(GL_QUADS);//左房檐glColor3f(0.6,0.3,0.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4,1.2,-0.2); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.0,0.8,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.8,-1.2); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.4,1.2,-1.0); //右房檐glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4,1.2,-0.2); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.8,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.8,0.8,-1.2); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.4,1.2,-1.0); glEnd();glBegin(GL_TRIANGLES);//前房檐glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4,1.2,-0.2); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.8,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.8,0.0); //后房檐glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4,1.2,-1.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.0,0.8,-1.2); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.8,0.8,-1.2); glEnd();//glTranslatef(0.15,0.0,-1.0);funnel();//烟囱glPopMatrix();//出栈}//----------中房子----------void middle_house(){glPushMatrix(); //入栈//---------正墙----------glTranslatef(0.0,-0.4,0.0);glBindTexture(GL_TEXTURE_2D, g_TexturesArray[0]); glBegin(GL_QUADS);glColor3f(1.0,1.0,1.0);//-----前下墙glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.4,-0.3); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.0,-0.3); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,-0.3); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.4,-0.3);//----前上墙glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.8,-0.3); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.4,-0.3); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.4,-0.3); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.8,-0.3);//-----后下墙glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.4,-0.9); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.0,-0.9); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,-0.9); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.4,-0.9);//-----后上墙glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.8,-0.9); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.4,-0.9); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.4,-0.9); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.8,-0.9);//----------前房檐glColor3f(0.6,0.3,0.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(1.2,1.1,-0.6); glTexCoord2f(1.0f, 0.0f);glVertex3f(1.2,0.8,-0.3); glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.4,0.8,-0.3); glTexCoord2f(0.0f, 1.0f);glVertex3f(-0.4,1.1,-0.6);//----------后房檐glTexCoord2f(1.0f, 1.0f);glVertex3f(1.2,1.1,-0.6); glTexCoord2f(1.0f, 0.0f);glVertex3f(1.2,0.8,-0.9); glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.4,0.8,-0.9); glTexCoord2f(0.0f, 1.0f);glVertex3f(-0.4,1.1,-0.6);//-------门--------glColor3f(0.6,0.3,0.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.59,0.29,-0.299); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.59,0.0,-0.299); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.405,0.0,-0.299); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.405,0.29,-0.299); //glTexCoord2f(1.0f, 1.0f);glVertex3f(0.395,0.29,-0.299);glTexCoord2f(1.0f, 0.0f);glVertex3f(0.395,0.0,-0.299); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.21,0.0,-0.299); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.21,0.29,-0.299);glEnd();//----------门前路glBindTexture(GL_TEXTURE_2D, g_TexturesArray[0]); glBegin(GL_QUADS);glColor3f(1.0,1.0,1.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.6,0.001,-0.29); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.6,0.001,1.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.2,0.001,1.0); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.2,0.001,-0.29); glEnd();//--------四叶窗glTranslatef(-0.7,0.5,0.0);window();glTranslatef(0.4,0.0,0.0);window();glTranslatef(0.0,-0.4,0.0);window();glTranslatef(-0.4,0.0,0.0);window();glPopMatrix();//出栈}void right_house(){glPushMatrix(); //入栈glTranslatef(0.8,-0.4,0.0);glBindTexture(GL_TEXTURE_2D, g_TexturesArray[0]); glBegin(GL_QUADS);glColor3f(1.0,1.0,1.0);//-----前墙glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.8,0.3); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.0,0.3); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,0.3); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.8,0.3);//-----左墙glTexCoord2f(1.0f, 1.0f);glVertex3f(0.0,0.8,0.3); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.0,0.0,0.3); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,-1.2); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.8,-1.2);//-----右墙glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.8,-1.2); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.0,-1.2); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.8,0.0,0.3); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.8,0.8,0.3); //-----后墙glTexCoord2f(1.0f, 1.0f);glVertex3f(0.8,0.8,-1.2); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.0,-1.2); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.0,-1.2); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.8,-1.2); //-----房顶//左房檐glColor3f(0.6,0.3,0.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4,1.2,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.0,0.8,0.3); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.8,-1.2); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.4,1.2,-0.9); //右房檐glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4,1.2,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.8,0.3); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.8,0.8,-1.2); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.4,1.2,-0.9); glEnd();glBegin(GL_TRIANGLES);//前房檐glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4,1.2,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.8,0.8,0.3); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.8,0.3); //后房檐glTexCoord2f(1.0f, 1.0f);glVertex3f(0.4,1.2,-0.9); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.0,0.8,-1.2); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.8,0.8,-1.2); glEnd();//--------------四叶窗glTranslatef(0.1,0.5,0.3);window();glTranslatef(0.4,0.0,0.0);window();glTranslatef(0.0,-0.4,0.0);window();glTranslatef(-0.4,0.0,0.0);window();glPopMatrix();//出栈}void gaolou(){glBegin(GL_QUADS);glColor3f(1.0,1.0,1.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.1,1.6,0.17321); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.1,0.0,0.17321); glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.1,0.0,0.17321); glTexCoord2f(0.0f, 1.0f);glVertex3f(-0.1,1.6,0.17321); glEnd();glBegin(GL_TRIANGLES);glColor3f(0.6,0.3,0.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.0,2.2,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.1,1.6,0.17321); glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.1,1.6,0.17321); glEnd();}void fengche(){glBegin(GL_QUADS);glColor3f(0.6,0.3,0.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.009,1.0,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.009,0.0,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.009,0.0,0.0); glTexCoord2f(0.0f, 1.0f);glVertex3f(-0.009,1.0,0.0);//glColor3f(1.0,1.0,1.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.25,1.0,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.25,0.2,0.0); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,0.2,0.0); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,1.0,0.0);glEnd();}void windmill(){glPushMatrix(); //入栈glTranslatef(-1.4,-0.4,0.0);glBindTexture(GL_TEXTURE_2D, g_TexturesArray[0]); //-------高楼-------gaolou();for(int i=1;i<=7;i++)glRotatef(60,0.0,1.0,0.0);gaolou();}glPushMatrix(); //入栈glRotatef(-60,0.0,1.0,0.0);glTranslatef(0.0,1.3,0.25);glRotatef(c,0.0,0.0,1.0);//---------风车-----------fengche();for(i=0;i<=3;i++){glRotatef(90,0.0,0.0,1.0);fengche();}glPopMatrix();//出栈c-=a;glPopMatrix();//出栈}void zhanlan1()//栅栏零件1{glBegin(GL_QUADS);glColor3f(1.0,1.0,1.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.025,0.25,0.025); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.025,0.0,0.025); glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.025,0.0,0.025); glTexCoord2f(0.0f, 1.0f);glVertex3f(-0.025,0.25,0.025); glEnd();glBegin(GL_TRIANGLES);glColor3f(0.6,0.3,0.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.0,0.3,0.0); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.025,0.25,0.025); glTexCoord2f(0.0f, 0.0f);glVertex3f(-0.025,0.25,0.025); glEnd();}void zhanlan2()//栅栏零件2{glPushMatrix(); //入栈glTranslatef(0.0,-0.4,0.5);glBindTexture(GL_TEXTURE_2D, g_TexturesArray[0]); zhanlan1();for(int i=1;i<=3;i++)glRotatef(90,0.0,1.0,0.0);zhanlan1();}glPopMatrix(); //出栈}void zhanlan3()//栅栏零件3{glBegin(GL_QUADS);glColor3f(1.0,1.0,1.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(0.2,0.025,0.025); glTexCoord2f(1.0f, 0.0f);glVertex3f(0.2,-0.025,0.025); glTexCoord2f(0.0f, 0.0f);glVertex3f(0.0,-0.025,0.025); glTexCoord2f(0.0f, 1.0f);glVertex3f(0.0,0.025,0.025); glEnd();}void zhanlan4()//栅栏零件4{glPushMatrix(); //入栈glTranslatef(0.0,-0.35,0.5);glScalef(1.5,0.5,0.5);glBindTexture(GL_TEXTURE_2D, g_TexturesArray[0]); zhanlan3();for(int i=1;i<=3;i++){glRotatef(90,1.0,0.0,0.0);zhanlan3();}glRotatef(90,1.0,0.0,0.0);glTranslatef(0.0,0.3,0.0);zhanlan3();for(i=1;i<=3;i++){glRotatef(90,1.0,0.0,0.0);zhanlan3();}glPopMatrix(); //出栈}void bar1()//后排栅栏{ glPushMatrix(); //入栈glTranslatef(-1.8,0.0,-2.5);zhanlan4();for(int i=1;i<=13;i++){zhanlan2();zhanlan4();glTranslatef(0.3,0.0,0.0);}zhanlan2();glPopMatrix(); //出栈}void bar2()//左排栅栏{ glPushMatrix(); //入栈glTranslatef(-1.3,0.0,-2.0);glRotatef(-90,0.0,1.0,0.0);for(int i=1;i<=10;i++){zhanlan2();zhanlan4();glTranslatef(0.3,0.0,0.0);}zhanlan2();glPopMatrix(); //出栈}void bar3()//右排栅栏{ glPushMatrix(); //入栈glTranslatef(2.6,0.0,-2.0);glRotatef(-90,0.0,1.0,0.0);for(int i=1;i<=10;i++){zhanlan2();zhanlan4();glTranslatef(0.3,0.0,0.0);}zhanlan2();glPopMatrix(); //出栈}void bar4()//前排栅栏1{ glPushMatrix(); //入栈glTranslatef(-1.8,0.0,0.5);zhanlan4();for(int i=1;i<=6;i++){zhanlan2();zhanlan4();glTranslatef(0.3,0.0,0.0);}zhanlan2();glPopMatrix(); //出栈}void bar5()//前排栅栏2{ glPushMatrix(); //入栈glTranslatef(0.9,0.0,0.5);zhanlan2();zhanlan4();for(int i=1;i<=4;i++){zhanlan2();zhanlan4();glTranslatef(0.3,0.0,0.0);}zhanlan2();glPopMatrix(); //出栈}void bars()//全部栅栏{bar1();bar2();bar3();bar4();bar5();}void glutDisplay(void) //显示函数{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);if(iMode==3)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);//表示物体的前向和后向面用填充面显示if(iMode==4)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);//表示物体的前向和后向面用线条显示glPushMatrix(); //入栈glTranslatef (-eye[0], -eye[1], -eye[2]); //视口glTranslatef(-0.2,-0.6,0.0);glRotatef(z, 0.0f, 1.0f, 0.0f);glRotatef(rot[0], 1.0f, 0.0f, 0.0f);glRotatef(rot[1], 0.0f, 1.0f, 0.0f);glRotatef(rot[2], 0.0f, 0.0f, 1.0f);glBindTexture(GL_TEXTURE_2D, g_TexturesArray[0]);glBegin(GL_QUADS);glColor3f(0.6,0.3,0.0);glTexCoord2f(1.0f, 1.0f);glVertex3f(2.1,-0.4,-2);glTexCoord2f(1.0f, 0.0f);glVertex3f(2.1,-0.4,1);glTexCoord2f(0.0f, 0.0f);glVertex3f(-1.8,-0.4,1);glTexCoord2f(0.0f, 1.0f);glVertex3f(-1.8,-0.4,-2);glEnd();left_house();//------------左房子-----------middle_house();//----------中房子----------right_house();//--------- 右房子------windmill();//--------------风车-------bars();//-----------------栅栏--------if(iMode==2)//判定是否旋转z+=0.05;glPopMatrix();//出栈glFlush();glutSwapBuffers();}void clamp(float *v){int i;for (i = 0; i < 3; i ++) //图像旋转一周后回到原地if (v[i] > 360 || v[i] < -360)v[i] = 0;}void glutMotion(int x, int y) //图像移动函数{if (mButton == BUTTON_LEFT) //按下左键时可以任意旋转图像{rot[0] -= (mOldY - y);rot[1] -= (mOldX - x);clamp (rot);}mOldX = x;mOldY = y;}void glutMouse(int button, int state, int x, int y)//鼠标控制函数{if(state == GLUT_DOWN){mOldX = x;mOldY = y;mButton = BUTTON_LEFT;} else if (state == GLUT_UP)mButton = -1;}void glutKeyboard(unsigned char key, int x, int y) //键盘控制函数{switch (key){case 's': //按S键放大图像case 'S':eye[2] -= 0.2;break;case 'W': //按W键缩小图像case 'w':eye[2] += 0.2;break;case '+':a+=0.05;break; //按+ 风车加速case '-':a-=0.05;break; //按- 风车减速}}int main(int argc, char** argv) //主函数{glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); glutInitWindowPosition( 0, 0 );glutInitWindowSize( 800, 600 );glutInit( &argc, argv );glutCreateWindow("-------------家-------------");glutDisplayFunc(glutDisplay);glutIdleFunc(glutDisplay);glutReshapeFunc(glutResize);glutMouseFunc(glutMouse);glutMotionFunc(glutMotion);glutKeyboardFunc(glutKeyboard);Init();CreatePopMenu();//生成第一个弹出式菜单glutMainLoop();return 0;}。