4.4.2 OpenGL几何变换编程实例
程序运行结果如下图:
#include <GL/glut.h> #include <stdlib.h> #include <math.h> /* 初始化显示窗口大小 */ GLsizei winWidth=,winHeight=; /* 设置世界坐标系的显示范围 */ GLfloat xwcMin=-300.0,xwcMax=300.0; GLfloat ywcMin=-300.0,ywcMax=300.0; void init (void) { /* 设置显示窗口的背景颜色为白色 */ glClearColor(1.0,1.0,1.0,0.0); } class wcPt3D { public: GLfloat x, y, z; }; /* 三维旋转变换,参数:旋转轴(由点p1和p2定义)和旋转角度(thetaDegrees)*/ void rotate3D (wcPt3D p1, wcPt3D p2, GLfloat thetaDegrees) { /* 设置旋转轴的矢量 */ float vx = (p2.x - p1.x); float vy = (p2.y - p1.y); float vz = (p2.z - p1.z); /*通过平移-旋转-平移复合变换序列完成任意轴的旋转(注意OpenGL中的反序表示)*/ glTranslatef (p1.x, p1.y, p1.z); //③移动p1到原始位置 /*②关于通过坐标原点的坐标轴旋转*/ glRotatef (thetaDegrees, vx, vy, vz); glTranslatef (-p1.x, -p1.y, -p1.z); //①移动p1到原点位置 } /* 三维比例放缩变换,参数:比例系数sx、sy、sz和固定点fixedPt */ void scale3D (GLfloat sx, GLfloat sy, GLfloat sz, wcPt3D fixedPt) { /*通过平移-放缩-平移复合变换序列完成任意点为中心点的比例缩放*/ /* ③反平移到原始位置*/ glTranslatef (fixedPt.x, fixedPt.y, fixedPt.z); glScalef (sx, sy, sz); // ②基于原点的比例放缩变换 /* ① 移动固定点到坐标原点*/ glTranslatef (-fixedPt.x, -fixedPt.y, -fixedPt.z); } void displayFcn (void) { /* 设置变换中心点位置 */ wcPt3D centroidPt,R_p1, R_p2; centroidPt.x=; centroidPt.y=; centroidPt.z=; R_p1=centroidPt; R_p2.x=; R_p2.y=; R_p2.z=; /* 设置几何变换参数*/ wcPt3D p1,p2,fixedPt; p1= R_p1; p2= R_p2; fixedPt=centroidPt; GLfloat tx=0.0,ty=100.0,tz=; GLfloat sx=0.5,sy=0.5,sz=; GLdouble thetaDegrees = ; glClear(GL_COLOR_BUFFER_BIT); // 清空显示窗口 glMatrixMode (GL_MODELVIEW); glLoadIdentity(); //清空变换矩阵为单位矩阵,恢复原始坐标系环境 /* 显示变换前几何对象 */ glColor3f(0.0,0.0,1.0); // 设置前景色为蓝色 glRecti(,,,); //显示蓝色矩形(变换前) /* 执行几何变换(注意以反序形式写出)*/ glTranslatef (tx, ty, tz); // ③平移变换 scale3D (sx, sy, sz, fixedPt); // ②比例放缩变换 rotate3D (p1, p2, thetaDegrees); // ①旋转变换 /* 显示变换后几何对象 */ glColor3f(1.0,0.0,0.0); //重新设置前景色为红色 glRecti(,,,); //显示红色矩形(变换后) glFlush(); } void winReshapeFcn(GLint newWidth,GLint newHeight) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(xwcMin,xwcMax,ywcMin,ywcMax); glClear(GL_COLOR_BUFFER_BIT); } void main(int argc, char ** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(,); glutInitWindowSize(winWidth,winHeight); glutCreateWindow("三维几何变换实例-OpenGL版复合变换"); init(); glutDisplayFunc(displayFcn); glutReshapeFunc(winReshapeFcn); glutMainLoop(); }
附上本实验的VC++工程代码(VC++2008)
4.4.2 OpenGL几何变换编程实例的更多相关文章
- PHP多进程编程实例
这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进 ...
- c#摄像头编程实例 (转)
c#摄像头编程实例 摄像头编程 安装摄像头后,一般可以找到一个avicap32.dll文件 这是一个关于设想头的类 using system;using System.Runtime.Intero ...
- JAX-RS 2.0 REST客户端编程实例
JAX-RS 2.0 REST客户端编程实例 2014/01/28 | 分类: 基础技术, 教程 | 0 条评论 | 标签: JAX-RS, RESTFUL 分享到:3 本文由 ImportNew - ...
- Android studio 下JNI编程实例并生成so库
Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...
- hadoop2.2编程:使用MapReduce编程实例(转)
原文链接:http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 从网上搜到的一篇hadoop的编程实例,对于初学者真是帮助太大 ...
- python学习_数据处理编程实例(二)
在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...
- 请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别
请求转发:MVC设计模式.细节.请求域属性的编程实例.请求重定向和请求转发的区别 MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层) ...
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- The MySQL C API 编程实例
在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇<The MySQL C API 编程实例>,希望对须要调用到MYSQL的C的API的朋友有 ...
随机推荐
- POJ3069 Saruman's Army【贪心】
Saruman the White must lead his army along a straight path from Isengard to Helm's Deep. To keep tra ...
- tree:以树形结构显示目录下的内容
tree命令 1.命令详解 [功能说明] tree命令的中文意思为“树”,功能是以树形结构列出指定目录下的所有内容包括所有文件.子目录及子目录里的目录和文件. [语法格式] tree [option] ...
- 解读grub.conf文件
我们将来看看grub.conf文件内语句,(注:...)内的东西是我们的解读内容. # grub.conf generated by anaconda # # Note that you do not ...
- vs code--snippet与快速提示
因为快速语法提示和建议冲突,所以要么禁用语法提示,要么禁用建议 Note that quick suggestions and Tab completion might interfere becau ...
- [bzoj2938][Poi2000]病毒_AC自动机
病毒 bzoj-2938 Poi-2000 题目大意:给你n个01串,问是否存在一个无限长的01串使得这个01的任意子串都不等于给出的01串. 注释:All_length<=30,000 想法: ...
- POJ 3608
1.计算P上y坐标值最小的顶点(称为 yminP )和Q上y坐标值最大的顶点(称为 ymaxQ). 2.为多边形在 yminP 和 ymaxQ 处构造两条切线 LP 和 LQ 使得他们对应的多边形位于 ...
- hdu5326 Work
题目链接:点击打开链接 题目大意:有n个人.各自管理不同的人,问有多少人管理k个人. 思路:先记录每一个人的直接上级.然后模拟路径压缩的过程进行计数求和. #include<stdio.h> ...
- 图论-BFS解无权有向图最短路径距离
概述 本篇博客主要内容: 对广度优先搜索算法(Breadth-First-Search)进行介绍: 介绍用邻接表的存储结构实现一个图(附C++实现源代码): 介绍用BFS算法求解无权有向图(附C++实 ...
- 关于TRIANGLE二维三角网格生成器在windows下的配置说明
近期须要用到三角网格生成的一些东西,所以就把TRIANGLE这个库编译了一下,发现编译过程还是略微有些纠结,于是就想到写下来.希望以后有些童鞋看到少走一些弯路. 首先很感谢eryar的帮助,很感谢! ...
- Windows10 显示库、隐藏6个目录、隐藏OneDrive
Win10的资源管理器与之前的版本号最大的不同就是默认隐藏了库,又在此电脑中显示了6个用户目录. 但因为习惯了使用库进行文件的管理,这一改变有些令人不习惯. 以下就让我来教大家怎样显示库.以及隐藏这6 ...