杭电计算机图形学:制作一个长方体几何变换的动画
实验内容:
自己编写包含平移、旋转、缩放这三种基本变换的程序(并非调用已有函数)。
我的想法:
其实上,这三种变换本质上是点的变换。
拿旋转来讲,我们只需要把一个4x4的单位矩阵变换成下面这样的矩阵(图),对应坐标值改变一下就好了,然后乘以每个点的坐标矩阵,(本质上呢就是每个点都做这样的变换),最后将变换后的24个点放在一个新的数组中,再画出来就ok了。
平移:
旋转:
缩放:
代码:
#include<GL/glut.h>
#include<stdlib.h>
#include<math.h>GLfloat sx = 2;
GLfloat sy = 2;
GLfloat sz = 2;
GLfloat tx = 0, ty = 0, tz = 0;
GLfloat angle1 = 60;
typedef GLfloat M4[4][4];
M4 mat2;
class pt3D {public:GLfloat x, y, z;
};
pt3D pivot = { 5.0,1.0,1.0 };
pt3D scale = { 0.0,1.0,0.0 };
pt3D verts[] = {{ -1.0,0.0,0.0 }, { 1.0,0.0,0.0 }, { 1.0,1.0,0.0 }, { -1.0,1.0,0.0 },//下面{ -1.0,0.0,0.0 }, { 1.0,0.0,0.0 }, { 1.0,0.0,2.0 },{-1.0,0.0,2.0},//左面{ 1.0,0.0,0.0 }, { 1.0,1.0,0.0 },{ 1.0,1.0,2.0 },{1.0,0.0,2.0},//前面{ 1.0,1.0,0.0 }, { -1.0,1.0,0.0 },{ -1.0,1.0,2.0 },{1.0,1.0,2.0},//右面{ -1.0,0.0,0.0 }, { -1.0,1.0,0.0 },{ -1.0,1.0,2.0 },{-1.0,0.0,2.0},//后面{ -1.0,0.0,2.0 }, { -1.0,1.0,2.0 },{ 1.0,1.0,2.0 },{1.0,0.0,2.0}//上面
};//长方体共有六个面,画一个面需要四个点,一共需要24个点
pt3D resultVerts[24];//存放变换后的矩阵,即最新的点坐标
class color {public:GLfloat r, g, b;
};
color colors[] = {{ 1.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 0.0, 1.0 }, { 1.0, 0.0, 1.0 },{1.0,3.0,0.0},{0.0,1.0,6.0}
};void init()
{glClearColor(1.0, 1.0, 1.0, 0.0);//我们刷新屏幕时,刷新的颜色glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0);//我们把-5到5的范围改大,显示就会x轴方向变小glMatrixMode(GL_PROJECTION);//告诉计算机,接下来我要对PROJECTION(投影)进行操作了//其它参数还有:MODELVIEW模型;TEXTURE纹理
}//矩阵初始化
void SetIdentity(M4 identitymatrix4x4) {//单位矩阵GLint col, row;//其实就是intfor (row = 0; row < 4; row++) {for (col = 0; col < 4; col++) {identitymatrix4x4[row][col] = (row == col);}}
}//矩阵乘法
void matMultiply(M4 m1, M4 m2)
{GLint row, col;M4 matTemp;for (row = 0; row < 4; row++) {for (col = 0; col < 4; col++) {matTemp[row][col] = m1[row][0] * m2[0][col] + m1[row][1] * m2[1][col] + m1[row][2] * m2[2][col] + m1[row][3] * m2[3][col];}}for (row = 0; row < 4; row++) {for (col = 0; col < 4; col++) {m2[row][col] = matTemp[row][col];}//最终矩阵相乘的结果存在m2中}
}//平移
void Translate3D(GLfloat tx, GLfloat ty, GLfloat tz)
{M4 matrixTranslate3D;//平移需要的第一个矩阵ASetIdentity(matrixTranslate3D);matrixTranslate3D[0][3] = tx;//沿x轴平移的单位matrixTranslate3D[1][3] = ty;matrixTranslate3D[2][3] = tz;//然后做矩阵乘法就好了//这一步的主要目的不是乘,是为了把结果存在矩阵mat2里面matMultiply(matrixTranslate3D, mat2);
}//实现每个点的平移,旋转,缩放
void TransformVerts3D()
{GLint k;for (k = 0; k < 24; k++) {resultVerts[k].x = mat2[0][0] * verts[k].x + mat2[0][1] * verts[k].y + mat2[0][2] * verts[k].z + mat2[0][3];resultVerts[k].y = mat2[1][0] * verts[k].x + mat2[1][1] * verts[k].y + mat2[1][2] * verts[k].z + mat2[1][3];resultVerts[k].z = mat2[2][0] * verts[k].x + mat2[2][1] * verts[k].y + mat2[2][2] * verts[k].z + mat2[2][3];}
}//仅对X轴旋转
void Rotate3D(pt3D pivotPt, GLfloat theta)
{M4 matrixRotate3D1;SetIdentity(matrixRotate3D1);matrixRotate3D1[1][1] = cos(theta);matrixRotate3D1[1][2] = sin(theta);matrixRotate3D1[2][1] = -sin(theta);matrixRotate3D1[2][2] = cos(theta);matMultiply(matrixRotate3D1, mat2);
}//缩放
void scale3D(GLfloat sx, GLfloat sy, GLfloat sz, pt3D fixedPt)
{M4 matScale3D;SetIdentity(matScale3D);matScale3D[0][0] = sx;matScale3D[0][3] = (1 - sx) * fixedPt.x;matScale3D[1][1] = sy;matScale3D[1][3] = (1 - sy) * fixedPt.y;matScale3D[2][2] = sz;matScale3D[2][3] = (1 - sz) * fixedPt.z;matMultiply(matScale3D, mat2);
}//画一个长方体
void Draw(pt3D* mat)
{int j;for (int i = 0; i < 6; i++) {//六个面glColor3f(colors[i].r, colors[i].g, colors[i].b);for (j = i * 4; j < i * 4 + 4; j++) {glVertex3f(mat[j].x, mat[j].y, mat[j].z);}}
}void DisplayFunc()
{//GL_COLOR_BUFFER_BIT把窗口清除为当前颜色;GL_DEPTH_BUFFER_BIT清除深度缓冲区glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//为了方便看旋转变化,我们画一下坐标轴glBegin(GL_LINES);glColor3f(0.0, 1.0, 0.0);//绿色glVertex3f(0, 0, 0);glVertex3f(4, 0, 0);//x轴glColor3f(1.0, 0.0, 0.0);//红色glVertex3f(0, 0, 0);glVertex3f(0, 4, 0);//y轴glColor3f(0.0, 0.0, 1.0);//蓝色glVertex3f(0, 0, 0);glVertex3f(0, 0, 4);glEnd();glRotatef(45, 0, 1, 0);glLoadIdentity();// 恢复初始坐标系SetIdentity(mat2);//矩阵初始化Translate3D(tx, ty, tz);TransformVerts3D();scale3D(sx, sy, sz, scale);TransformVerts3D();Rotate3D(pivot, angle1);TransformVerts3D();glRotatef(45,0,1,0);glRotatef(45, 0, 0, 1);glBegin(GL_QUADS);Draw(resultVerts);glEnd();glFlush();
}void processSpecialKeys(int key, int x, int y)
{switch (key) {case GLUT_KEY_UP:ty -= 0.1; break;case GLUT_KEY_DOWN:ty += 0.1; break;case GLUT_KEY_LEFT:tx -= 0.1; break;case GLUT_KEY_RIGHT:tx += 0.1; break;case GLUT_KEY_PAGE_UP:sx += 0.1, sy += 0.1; sz += 0.1; break;case GLUT_KEY_PAGE_DOWN:sx -= 0.1, sy -= 0.1, sz -= 0.1; break;//PAGE_UP和PAGE_DOWN这两个键控制缩放case GLUT_KEY_HOME:angle1 += 50; break;//转50下转回原点case GLUT_KEY_END:tx = 4; ty = 0.5; tz = 0; angle1 = 60;break;//回到原始状态default:break;}DisplayFunc();
}void main(int argc, char* argv[])
{//这个函数用来初始化 GLUT 库,这个函数从 main 函数获取其两个参数glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//SINGLE单缓存,建立RGBA模式的窗口glutInitWindowPosition(50, 50);glutInitWindowSize(600, 600);glutCreateWindow("3DCuboid");init();glutDisplayFunc(DisplayFunc);//回调函数glutSpecialFunc(processSpecialKeys);//键盘glutMainLoop();//使程序进入事件处理循环。该函数必须是main主函数的最后一条语句。
}
参考博客:https://blog.csdn.net/qq_34376715/article/details/80494449
大家可以去看一下这篇文章哦,很棒,我只是照猫画虎罢了(第一次发博客,有错误请大家多多指正,谢谢~)
杭电计算机图形学:制作一个长方体几何变换的动画相关推荐
- 2011---2013年杭电计算机历年研究生复试---笔试编程
1.输入三个正整数A.B.C(0<A.B.C<1000),判断这三个数能不能构成一个三角形. 转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/a ...
- 杭电 2016 计算机组成原理,杭电计算机组成原理多功能ALU设计实验
<杭电计算机组成原理多功能ALU设计实验>由会员分享,可在线阅读,更多相关<杭电计算机组成原理多功能ALU设计实验(6页珍藏版)>请在人人文库网上搜索. 1.杭州电子科技大学计 ...
- 2019杭电计算机考研经验贴(初试+复试)
为期一年的杭电考研之旅结束啦!一年的付出总算没有白费,顺利上岸,进入杭电脑机交互实验室.今天和导师签了双选表,现在在回学校的高铁上,想着写一份经验贴,为下一届考研的学弟学妹们留下点东西. 一.初试 杭 ...
- 杭电计算机考研失败,2020杭电计算机考研感想
初试 本科是普通二本电子专业,因为本科期间做过几个比赛,拿过几个奖所以考研前一直对自己很有信心,非211不读,不是985往后考虑.但是!我从3月份开始准备的,随着学习越来越发现考研其实和自己平时比赛实 ...
- 杭电计算机考研初试经验
杭电计算机考研初试经验 初试成绩 21届考研 政治:65 英语一:66 数学一:123 专业课:108 本人基础 浙江省杭州市某二本渣渣学生,高中没好好学习,里一本线差几分(事实上过了一本线也上不了一 ...
- 2021杭电计算机考研数一英一408专业课考研经验贴
2021杭电计算机考研数一英一408专业课考研经验贴 前言 考研准备 教材 其他 打基础阶段(3月-6月) 数学 英语 专业课 暑假冲刺阶段(7月-9月) 数学 英语 专业课 考前三个月(10月-12 ...
- 杭电计算机考研经验交流
写给2020年励志考杭电计算机的学弟学妹! 2019级的初试结束了,回想在杭州这一个学期呆像是做梦一样,还没有回过神来细细品味杭州的美景,正式成为了杭州电子科技大学计算机学院的一员.分享一下自己的杭电 ...
- 2015年杭电计算机存储器扩展,杭电计算机组成原理存储器设计实验5
<杭电计算机组成原理存储器设计实验5>由会员分享,可在线阅读,更多相关<杭电计算机组成原理存储器设计实验5(4页珍藏版)>请在人人文库网上搜索. 1.杭州电子科技大学计算机学院 ...
- 杭电计算机考研经验总结
我今年报考的是杭电计算机专硕,初试的成绩287,专硕分数线280.可以说,我初试的分数真的特别差了,尤其是数学85.在初试结束之后,我分析了自己低分的原因,一方面是学校还有一些杂事总是打断我,还有一方 ...
最新文章
- 在CentOS 6.9 x86_64的nginx 1.12.2上开启echo-nginx-module模块实录
- Java8 Map中新增的方法使用总结
- GraphViz :1 安装和简单使用
- 关于tensorflow的碎片
- 创建控制文件后的疑难解答
- 20180110小测
- 【PAT乙】1002 写出这个数 (20分)
- ffplay整体框架
- 2022年iOS面试题简答题
- Android 中this的用法
- 未转变者服务器保存红字警告,未转变者3.0怎么设置自己开的服
- KanziStudio应用程序配置详解
- python爬取网易云音乐评论分析_Python爬取网易云音乐评论(附加密算法)
- 计算机大赛应用文档制作,PPT制作应用大赛策划书
- 徐家骏是华为数据中心的头,技术超级牛人,一级部门总监,华为副总裁,年收入过千万。
- 数学图形之单叶双曲面
- Debian11安装搜狗输入法
- 职中计算机一级证,职中计算机等级一级考证教学网站的设计
- 使用 Git上传代码到coding.net代码仓库详解
- 登陆网上邻居授权共享文件夹没有弹出登陆窗口解决办法