作业名称:
利用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小时内删除。