作业名称: | 利用OpenGL实现有立体茶壶旋转图形 |
学 院: | 航海学院 |
班 级: | 03021301 |
学 号: | 2013300749 |
姓 名: | 刘德柱 |
团队组成: | 刘德柱主要负责茶壶形态构建函数模块、潘峰主要负责旋转实现函数,调试、完善、报告等共同完成。 |
西北工业大学
2022年4月26日
请填写以下十项内容,将表格按页对齐(插入空行),勿删除任何部分。
1、问题与背景(描述程序所要解决的问题或应用背景)
图片,指的就是平面图片,二维图片。它所记录的,就是当前平面的内容。至于其它面有什么它是不会记录的,也是无法记录的。如你在拍一个人的正面图像,它的侧面或背后有什么,你知道?还是相机知道?是红的?黑的?没人知道!现在你让这张图片进行立体旋转,旋转到人的背后之后,能看到什么?如果你要旋转,则就不能普通的平面图片,而应该是三维图像! 这就是c++中opengl的用处了。它可以实现立体旋转,旋转360°地看这个物体,并且还能给三维物体添加颜,更具真实感和视觉效果。 |
2、开发工具(列出所使用的开发工具和第3方开发库)
VC++6. 0,MFC,Windows API |
3、主要功能(详细说明程序的功能)
本c++程序利用OpenGL实现旋转图形,可以使示例中有立体茶壶实现360°旋转,使观众全方位立体感知茶壶形态。 |
4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)
OpenGL: 的工作顺序就是一个从定义几何要素到把象素段写入帧缓冲 区的过程。在屏幕上显示图象的主要步骤是以下3 步: 1)构造几何要素(点、线、多边形、图像、位图),创建对象的数学描 述。在三维空间放置对象,选择有利的观察点。 2)计算对象的颜,这些颜可能直接定义,或由光照条件及纹理间 接给出。 3)光栅化,把对象的数学描述和颜信息转换到屏幕的象素。 在本程序中。首先使用相关的WINDOWS API创建窗口,其次实现程序的相应功能: 1.使用OPENGL相应库函数画出正方体。 2.使之旋转起来。 3.在窗体中响应鼠标事件,控制正方体的旋转。 程序流程如图所示: 至此,程序的大体内容以及机构已经构造成型 OPENGL的主体绘制工作: 首先使用glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 清除屏幕和深度缓存,然后使用glLoadIdentity();重置当前的模型观察矩阵,确定绘制好图形的位置glTranslatef(0.0f,0.0f,z); 移入屏幕 z 个单位。函数glTranslatef(x, y, z)作用为沿着 X, Y 和 Z 轴移动; 现在是本程序中最重要的语句:glRotatef(angle,0.0f,0.0f,0.0f),其中angle为每次旋转的角度,之后分别是XYZ三个轴的旋转分量,这三个旋转分量构成了三维坐标轴中的旋转法向量。 绘制: void COPENGLActView::OnDraw(CDC* pDC) settimer头文件{ COPENGLActDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); static GLfloat xangle = 10.0f; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix (); glTranslatef(0.0f, 0.0f, -8.5); glRotatef(xangle, 1.0f, 0.0f, 0.0f); xangle+= 10.0f; auxSolidTeapot(1.5); glPopMatrix (); glFlush(); if(FALSE==::SwapBuffers(m_pContextDC->GetSafeHdc())) AfxMessageBox("½»»»»º³åÇøʧ°Ü"); } 重置模型观察矩阵 : glMatrixMode(GL_PROJECTION); // 选择投影矩阵 glLoadIdentity(); // 重置投影矩阵 // 设置视口的大小 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵 glLoadIdentity(); // 重置模型观察矩阵 视图框的输出: BOOL COPENGLActView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认的准备 return DoPreparePrinting(pInfo); } void COPENGLActView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: 添加额外的初始化之前打印 } void COPENGLActView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: 添加打印后进行清理 } void COPENGLActView::OnTimer(UINT nIDEvent) { // TODO: 在这里添加消息处理程序代码和/或调用默认 旋转的定时操作和动画效果处理: this->OnDraw(this->GetDC()); CView::OnTimer(nIDEvent); } void COPENGLActView::OnAct() { SetTimer(1,15,NULL); } 显示场景的设置: Void RenderSene(void) { static float angle = 0.0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix (); glTranslatef(0.0f, 0.0f, -8.5); glRotatef(xangle, 1.0f, 0.0f, 0.0f); xangle+= 10.0f; auxSolidTeapot(1.5); glPopMatrix (); glFlush(); } 通过以上步骤,实现图形呈现,再通过旋转函数实现立体模型茶壶的旋转。 |
5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)
OPENGLAct.dsw VC6工作区文件 OPENGLAct.dsp VC6工程文件 OPENGLAct.cpp 主程序 OPENGLAct.h 主程序头文件 MainFrm.cpp 框架类的实现文件 OPENGLActDoc.cpp 文档 OPENGLActView.cpp 视图框应用程序 OPENGLActView.h 视图框应用程序头文件 StdAfx.cpp VC6预处理文件 StdAfx.h VC6预处理头文件 OPENGLAct.rc 资源文件 resource.h 资源定义头文件 res 图标存放文件夹 OPENGLAct.ico 应用程序图标 |
6、函数模块(程序中各个函数的原型声明及其说明)
class COPENGLActApp : public CWinApp 应用程序类 class COPENGLActDlg : public CDialog 应用程序对话框 void COPENGLActView::OnDraw(CDC* pDC);立体模型绘制函数 BOOL COPENGLActView::PreCreateWindow(CREATESTRUCT& cs) ;窗口类或者样式的修改 BOOL COPENGLActView::OnPreparePrinting(CPrintInfo* pInfo) ;函数的输出,实现立体茶壶的呈现 void COPENGLActView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) ;打印之前的初始化 void COPENGLActView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)打印之后的清理操作 void COPENGLActView::OnSize(UINT nType, int cx, int cy) 尺寸控制 void COPENGLActView::OnTimer(UINT nIDEvent)定时器 void COPENGLActView::OnAct() 动画 |
7、使用说明(运行程序的小型说明书)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论