主要仪器设备

VisualStudio C++2015

Windows10环境

Glut压缩包

Ex2工程

操作方法和实验步骤

1.绘制立方体

桌子由立方体组成,我们可以通过绘制六个面来构造一个立方体。六个面的绘制需要八个顶点的参数,而每个顶点均有x,y,z三个参数,如果全部传入的话参数的个数会达到8*3=24个。而我们只需要知道2个x,2个y以及2个z即可构造八个顶点。如图所示,它们的坐标分别是(x1,y1,z2), (x2,y1,z2), (x1,y2,z2), (x2,y2,z2), (x1,y1,z1),(x2,y1,z1), (x1,y2,z1), (x2,y2,z1)。每个面使用QL_QUADS方式绘制所使用的顶点是(v1,v2,v4,v3),(v5,v6,v8,v7), (v3,v4,v8,v7), (v1,v2,v6,v5), (v1,v3,v7,v5), (v2,v4,v8,,v6)。

2.绘制桌子

之前已经完成了绘制立方体的函数,现在只需要把桌子拆分成5个立方体进行绘制就可以了。计算需要传入的参数,使用Draw_Cube函数进行绘制。

3.模型变换——平移、旋转、缩放

这部分功能的实现通过重绘时调用函数redraw实现。根据要求使用glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);来确定显示模式为使用线段显示物体所有面。在模型进行平移、旋转、缩放时用到的函数分别是glTranslatef,glRotatef以及glScalef函数。这三个函数中分别利用了三个因子fTranslate,fRotate以及fScale。他们控制了平移的方向,旋转轴以及缩放尺寸等等。

代码如下:

// main.cpp : 定义控制台应用程序的入口点。
#include "glut.h"float fTranslate;//平移因子
float fRotate;//旋转因子
float fScale=1.0f;//缩放因子void Draw_Cube(GLfloat x1, GLfloat x2, GLfloat y1,GLfloat y2,GLfloat z1,GLfloat z2)
{   //桌子由立方体组成,已知六个参数即可构造八个顶点int i, j;GLfloat vertex[8][3] = {//八个顶点,从v1-v8x1,y1,z2,x2,y1,z2,x1,y2,z2,x2,y2,z2,x1,y1,z1,x2,y1,z1,x1,y2,z1,x2,y2,z1};GLint surface[6][4] = {//v1对应0,以此类推0,1,3,2,4,5,7,6,2,3,7,6,0,1,5,4,0,2,6,4,1,3,7,5};glBegin(GL_QUADS);//指定绘制方式//将每个立方体分成六个面绘制for (i = 0; i < 6; i++)for (j = 0; j < 4; j++)glVertex3fv(vertex[surface[i][j]]);glEnd();
}
void Draw_Table()
{//将桌子拆分成5个立方体绘制Draw_Cube(0.0, 1.0, 0.0, 0.8, 0.6, 0.8);//桌面Draw_Cube(0.1, 0.3, 0.1, 0.3, 0.0, 0.6);//四条腿Draw_Cube(0.7, 0.9, 0.1, 0.3, 0.0, 0.6);Draw_Cube(0.1, 0.3, 0.5, 0.7, 0.0, 0.6);Draw_Cube(0.7, 0.9, 0.5, 0.7, 0.0, 0.6);
}void reshape(int width, int height)
{//当窗口尺寸改变时改变尺寸if (height==0)                                     // Prevent A Divide By Zero By{height=1;                                       // Making Height Equal One}glViewport(0,0,width,height);                        // Reset The Current ViewportglMatrixMode(GL_PROJECTION);                       // Select The Projection MatrixglLoadIdentity();                                    // Reset The Projection Matrix// Calculate The Aspect Ratio Of The WindowgluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);                           // Select The Modelview MatrixglLoadIdentity();                                 // Reset The Modelview Matrix
}void idle()
{glutPostRedisplay();
}void redraw()
{//display in wireframe modeglPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glClear(GL_COLOR_BUFFER_BIT);//清除窗口glLoadIdentity();                      // Reset The Current Modelview Matrix//模型变换——移动 glPushMatrix();//glpushmatrix与glpopmatrix配合使用可以消除上一次变换对本次变换的影响glTranslatef(-2.5f, 0.0f,-6.0f);//放在左边glTranslatef(0.0f, fTranslate, 0.0f);Draw_Table();                  glPopMatrix();//模型变换——旋转glPushMatrix();glTranslatef(0.0f, 0.0f,-6.0f);//放在中间glRotatef(fRotate, 0, 1.0f, 0);         // Rotate around Y axisDraw_Table();                        // Draw triangleglPopMatrix();//模型变换——缩放glPushMatrix();glTranslatef(2.0f, 0.0f, -6.0f);glScalef(fScale, fScale,fScale);Draw_Table();glPopMatrix();//更新因子fTranslate += 0.005f;fRotate += 0.5f;fScale -= 0.005f;if(fTranslate > 0.5f)fTranslate = 0.0f;if (fScale < 0.5f)//缩小到一定程度之后变回原来大小fScale = 1.0f;glutSwapBuffers();
}int main (int argc,  char *argv[])
{glutInit(&argc, argv);//对glut函数库进行初始化glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);//指定glutCreateWindow函数将要创建的窗口显示模式 RGB 双缓冲glutInitWindowSize(640,480);//窗口大小                                         glutCreateWindow("Exercise2");//打开设置好的窗口,进入glutMainLoop之前这个窗口不会显示glutDisplayFunc(redraw);//指定当前窗口需要重绘时调用的函数glutReshapeFunc(reshape);//注册窗口大小改变时回调函数glutIdleFunc(idle);  //可以执行连续动画              glutMainLoop();//进入glut事件处理循环,永远不会返回return 0;
}

实验结果

其中左边的桌子向上平移到一定的位置回到原位置继续重复动作,中间的桌子绕y轴旋转,右边的桌子逐渐缩小到一定程度回到原大小继续重复动作。

如有错误,请批评指正(*/ω╲*)

opengl绘制桌子(平移、旋转、缩放)相关推荐

  1. OpenGL中的平移旋转缩放

    1.opengl中缩放使用的函数是glScalef 其原型为void glScalef(GLfloat  x,  GLfloat  y,  GLfloat  z); 该函数表示模型在各轴上进行扩大和缩 ...

  2. Unity 触屏手势控制Camera平移旋转缩放

    Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...

  3. Python 绘制椭圆 平移 旋转

    前言:使用极坐标系描述起来似乎更加方便. 效果 椭圆公式演变 直角坐标形式 x2a2+y2b2=1\frac{x^2}{a^2}+\frac{y^2}{b^2}=1a2x2​+b2y2​=1 极坐标形 ...

  4. 三维空间中的几何变换-平移旋转缩放

    前言 前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记. 文章内容部分引用并参考了下面的博客: http://netclass.csu.ed ...

  5. Unity矩阵平移旋转缩放Matrix4x4

    Unity中的矩阵(Matrix4x4) 最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转.平移.缩放.(注意这里本文中的transform组件式基于unity ...

  6. WebGL编程指南-24 同时使用漫反射光和环境反射光、立方体平移旋转缩放变换时漫反射光和环境反射光处理

    1.demo效果 此效果是上一章绘制的立方体基础上,向Y轴方向平移一个单位,然后绕Z轴旋转30度. 如上图,归纳一下物体坐标变换法向量变化的规律如下 平移变换, 法向量不会改变 旋转变换, 大多数情况 ...

  7. flutter Transform 矩阵变换(平移旋转缩放)

    Transform其子Widget绘制时外面包着矩阵变换(transformation),通过它可以实现各种矩阵操作. 1.widget平移 效果图 2.旋转(rotate) 效果图: 3.缩放 Tr ...

  8. 三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放

    给定一个二维点(x, y),那么形如(kx, ky, k)的所有三元组就都是等价的,它们就是这个点的齐次坐标(homogeneous).齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指 ...

  9. 三维坐标要建一个4*4的矩阵?平移 旋转 缩放

    移植不知道三维物体的旋转平移缩放和矩阵的关系.找到这篇文章借鉴一下. 转自:https://blog.csdn.net/ALLENJIAO/article/details/80348362 怎么平移一 ...

最新文章

  1. HDR (automatic exposure control + Tonemapping + Bloom)
  2. Linux进程间通信中的文件和文件锁
  3. 【知识星球】LeNet5,AlexNet,VGG,MobileNet它们的前身都是什么,你知道吗?
  4. mwArray与C++接口
  5. 上几个WebAPI就算微服务架构?Too Young!
  6. python xlwt xlrd模块详解_python操作excel之xlrd、xlwt模块详解
  7. 语言五子棋无ai程序框图_微软多语言预训练模型T-ULRv2登顶XTREME排行榜
  8. 【Python】获取星期字符串
  9. koa mysql 按钮级权限_Vue 指令实现按钮级别权限管理功能
  10. 安卓案例:线性布局嵌套
  11. Java Web基础回顾 —HTTP
  12. 笔记.cloudflare 的橙色云代理ssl坑
  13. 爱忘事、不自律,有了这5款时间管理工具,堪比“罗志祥”!
  14. VCIP2020:基于深度学习合成参考帧
  15. 基于区块链的数字藏品管控方案
  16. 微信分享自定义图标大小限制_微信分享时安卓的自定义参数无效的解决办法
  17. STM32F407ZGT6最小系统原理图和PCB
  18. 包含新房二手房租房功能的房产小程序开发方案
  19. 怎么查看war包代码
  20. 6 MySQL 集群Cluster

热门文章

  1. 狼组CTF web-baby.php
  2. 开发餐饮点菜PDA设备记录一
  3. html绘制动态小人,JavaScript和html5 canvas如何绘制一个小人的代码
  4. 自组网中继台_解决方案 无人机无线中继组网_Mesh自组网,无线自组网电台,mesh自组网单兵,自组网设备,无人机图传电台,应急通信自组网基站,COFDM MESH芯片厂家...
  5. arcgispython编程案例_ArcGIS Python编程案例(1)-Python语言基础
  6. JAVA导出excel 动态合并单元格
  7. 实战|记一次攻防演练打点
  8. 导入cx_Oracle时提示DLL load failed问题解决
  9. 数字图像处理5--边缘检测探究(内容较多,持续更新)
  10. MODIS数据MRT批处理