实验内容:
自己编写包含平移、旋转、缩放这三种基本变换的程序(并非调用已有函数)。

我的想法:
其实上,这三种变换本质上是点的变换。
拿旋转来讲,我们只需要把一个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
大家可以去看一下这篇文章哦,很棒,我只是照猫画虎罢了(第一次发博客,有错误请大家多多指正,谢谢~)

杭电计算机图形学:制作一个长方体几何变换的动画相关推荐

  1. 2011---2013年杭电计算机历年研究生复试---笔试编程

    1.输入三个正整数A.B.C(0<A.B.C<1000),判断这三个数能不能构成一个三角形. 转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/a ...

  2. 杭电 2016 计算机组成原理,杭电计算机组成原理多功能ALU设计实验

    <杭电计算机组成原理多功能ALU设计实验>由会员分享,可在线阅读,更多相关<杭电计算机组成原理多功能ALU设计实验(6页珍藏版)>请在人人文库网上搜索. 1.杭州电子科技大学计 ...

  3. 2019杭电计算机考研经验贴(初试+复试)

    为期一年的杭电考研之旅结束啦!一年的付出总算没有白费,顺利上岸,进入杭电脑机交互实验室.今天和导师签了双选表,现在在回学校的高铁上,想着写一份经验贴,为下一届考研的学弟学妹们留下点东西. 一.初试 杭 ...

  4. 杭电计算机考研失败,2020杭电计算机考研感想

    初试 本科是普通二本电子专业,因为本科期间做过几个比赛,拿过几个奖所以考研前一直对自己很有信心,非211不读,不是985往后考虑.但是!我从3月份开始准备的,随着学习越来越发现考研其实和自己平时比赛实 ...

  5. 杭电计算机考研初试经验

    杭电计算机考研初试经验 初试成绩 21届考研 政治:65 英语一:66 数学一:123 专业课:108 本人基础 浙江省杭州市某二本渣渣学生,高中没好好学习,里一本线差几分(事实上过了一本线也上不了一 ...

  6. 2021杭电计算机考研数一英一408专业课考研经验贴

    2021杭电计算机考研数一英一408专业课考研经验贴 前言 考研准备 教材 其他 打基础阶段(3月-6月) 数学 英语 专业课 暑假冲刺阶段(7月-9月) 数学 英语 专业课 考前三个月(10月-12 ...

  7. 杭电计算机考研经验交流

    写给2020年励志考杭电计算机的学弟学妹! 2019级的初试结束了,回想在杭州这一个学期呆像是做梦一样,还没有回过神来细细品味杭州的美景,正式成为了杭州电子科技大学计算机学院的一员.分享一下自己的杭电 ...

  8. 2015年杭电计算机存储器扩展,杭电计算机组成原理存储器设计实验5

    <杭电计算机组成原理存储器设计实验5>由会员分享,可在线阅读,更多相关<杭电计算机组成原理存储器设计实验5(4页珍藏版)>请在人人文库网上搜索. 1.杭州电子科技大学计算机学院 ...

  9. 杭电计算机考研经验总结

    我今年报考的是杭电计算机专硕,初试的成绩287,专硕分数线280.可以说,我初试的分数真的特别差了,尤其是数学85.在初试结束之后,我分析了自己低分的原因,一方面是学校还有一些杂事总是打断我,还有一方 ...

最新文章

  1. 在CentOS 6.9 x86_64的nginx 1.12.2上开启echo-nginx-module模块实录
  2. Java8 Map中新增的方法使用总结
  3. GraphViz :1 安装和简单使用
  4. 关于tensorflow的碎片
  5. 创建控制文件后的疑难解答
  6. 20180110小测
  7. 【PAT乙】1002 写出这个数 (20分)
  8. ffplay整体框架
  9. 2022年iOS面试题简答题
  10. Android 中this的用法
  11. 未转变者服务器保存红字警告,未转变者3.0怎么设置自己开的服
  12. KanziStudio应用程序配置详解
  13. python爬取网易云音乐评论分析_Python爬取网易云音乐评论(附加密算法)
  14. 计算机大赛应用文档制作,PPT制作应用大赛策划书
  15. 徐家骏是华为数据中心的头,技术超级牛人,一级部门总监,华为副总裁,年收入过千万。
  16. 数学图形之单叶双曲面
  17. Debian11安装搜狗输入法
  18. 职中计算机一级证,职中计算机等级一级考证教学网站的设计
  19. 使用 Git上传代码到coding.net代码仓库详解
  20. 登陆网上邻居授权共享文件夹没有弹出登陆窗口解决办法

热门文章

  1. 用Python实现简单的名片管理系统
  2. 市民收留流浪汉18年被指使用免费劳动力遭索赔
  3. redis进阶持久化、事务、主从复制、集群高可用
  4. linux find 命令查找文件和文件夹
  5. samba共享服务的部署及安全优化
  6. 年轻人十大创业项目是哪些?
  7. switch case的用法
  8. MATLAB 利用YALMIP+Gurobi 求解线性规划 -多无人机扫描覆盖
  9. 简单的CSS在页面中点击超链接跳转新的页面
  10. 阿里云全球第二批MVP 祁宁专访 - 社区的成长才是我们的价值所在