opengl绘制桌子(平移、旋转、缩放)
主要仪器设备
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绘制桌子(平移、旋转、缩放)相关推荐
- OpenGL中的平移旋转缩放
1.opengl中缩放使用的函数是glScalef 其原型为void glScalef(GLfloat x, GLfloat y, GLfloat z); 该函数表示模型在各轴上进行扩大和缩 ...
- Unity 触屏手势控制Camera平移旋转缩放
Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...
- Python 绘制椭圆 平移 旋转
前言:使用极坐标系描述起来似乎更加方便. 效果 椭圆公式演变 直角坐标形式 x2a2+y2b2=1\frac{x^2}{a^2}+\frac{y^2}{b^2}=1a2x2+b2y2=1 极坐标形 ...
- 三维空间中的几何变换-平移旋转缩放
前言 前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记. 文章内容部分引用并参考了下面的博客: http://netclass.csu.ed ...
- Unity矩阵平移旋转缩放Matrix4x4
Unity中的矩阵(Matrix4x4) 最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转.平移.缩放.(注意这里本文中的transform组件式基于unity ...
- WebGL编程指南-24 同时使用漫反射光和环境反射光、立方体平移旋转缩放变换时漫反射光和环境反射光处理
1.demo效果 此效果是上一章绘制的立方体基础上,向Y轴方向平移一个单位,然后绕Z轴旋转30度. 如上图,归纳一下物体坐标变换法向量变化的规律如下 平移变换, 法向量不会改变 旋转变换, 大多数情况 ...
- flutter Transform 矩阵变换(平移旋转缩放)
Transform其子Widget绘制时外面包着矩阵变换(transformation),通过它可以实现各种矩阵操作. 1.widget平移 效果图 2.旋转(rotate) 效果图: 3.缩放 Tr ...
- 三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放
给定一个二维点(x, y),那么形如(kx, ky, k)的所有三元组就都是等价的,它们就是这个点的齐次坐标(homogeneous).齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指 ...
- 三维坐标要建一个4*4的矩阵?平移 旋转 缩放
移植不知道三维物体的旋转平移缩放和矩阵的关系.找到这篇文章借鉴一下. 转自:https://blog.csdn.net/ALLENJIAO/article/details/80348362 怎么平移一 ...
最新文章
- HDR (automatic exposure control + Tonemapping + Bloom)
- Linux进程间通信中的文件和文件锁
- 【知识星球】LeNet5,AlexNet,VGG,MobileNet它们的前身都是什么,你知道吗?
- mwArray与C++接口
- 上几个WebAPI就算微服务架构?Too Young!
- python xlwt xlrd模块详解_python操作excel之xlrd、xlwt模块详解
- 语言五子棋无ai程序框图_微软多语言预训练模型T-ULRv2登顶XTREME排行榜
- 【Python】获取星期字符串
- koa mysql 按钮级权限_Vue 指令实现按钮级别权限管理功能
- 安卓案例:线性布局嵌套
- Java Web基础回顾 —HTTP
- 笔记.cloudflare 的橙色云代理ssl坑
- 爱忘事、不自律,有了这5款时间管理工具,堪比“罗志祥”!
- VCIP2020:基于深度学习合成参考帧
- 基于区块链的数字藏品管控方案
- 微信分享自定义图标大小限制_微信分享时安卓的自定义参数无效的解决办法
- STM32F407ZGT6最小系统原理图和PCB
- 包含新房二手房租房功能的房产小程序开发方案
- 怎么查看war包代码
- 6 MySQL 集群Cluster
热门文章
- 狼组CTF web-baby.php
- 开发餐饮点菜PDA设备记录一
- html绘制动态小人,JavaScript和html5 canvas如何绘制一个小人的代码
- 自组网中继台_解决方案 无人机无线中继组网_Mesh自组网,无线自组网电台,mesh自组网单兵,自组网设备,无人机图传电台,应急通信自组网基站,COFDM MESH芯片厂家...
- arcgispython编程案例_ArcGIS Python编程案例(1)-Python语言基础
- JAVA导出excel 动态合并单元格
- 实战|记一次攻防演练打点
- 导入cx_Oracle时提示DLL load failed问题解决
- 数字图像处理5--边缘检测探究(内容较多,持续更新)
- MODIS数据MRT批处理