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的朋友有 ...
随机推荐
- eas之视图冻结与解冻
// 冻结视图 table.getViewManager().freeze(verticalIndex, horizonIndex); //冻结视图:该方法在table还没显示的时候使用,也就是该方法 ...
- request.getScheme()、 request.getServerName() 、 request.getServerPort() 、 request.getContextPath()
<% String basePath = request.getScheme() + "://" + request.getServerName() + ":&qu ...
- PHP多进程初探 --- 利用多进程开发点儿东西吧
[原文地址:https://blog.ti-node.com/blog...] 干巴巴地叨逼叨了这么久,时候表演真正的技术了! 做个高端点儿的玩意吧,加入我们要做一个任务系统,这个系统可以在后台帮我们 ...
- 11、mybatis的映射xml中参数类型的别名
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型.需要resultType指定输出结果的映射类型. 如果在指定类型时输入类型全 ...
- 在ecshop模板使用自定义函数
https://blog.csdn.net/shaolinld/article/details/46400485 在ecshop模板使用自定义函数 可以增加自定义函数,在模板直接调用,例如: {$us ...
- 【Codeforces 342A】Xenia and Divisors
[链接] 我是链接,点我呀:) [题意] [题解] 最后a,b,c只有以下3种情况 1,2,4 1,2,6 1,3,6 那么用cnt[8]统计每个数字出现的次数. 输出cnt[4]次1,2,4 (如果 ...
- elasticsearch 分布式阅读笔记(二)
说明 扩展分为 纵向扩展:购买更好的服务器 横向扩展:增加服务器(elasticsearch更适合横向扩展) elasticsearch可以用于构建高可用和可扩展的系统,elasticsearch天生 ...
- git 强制pull
git fetch --all git reset --hard origin/master git pull
- C# ArcgisEngine开发中,对一个图层进行过滤,只显示符合条件的要素
转自原文 C# ArcgisEngine开发中,对一个图层进行过滤,只显示符合条件的要素 有时候,我们要对图层上的地物进行有选择性的显示,以此来满足实际的功能要求. 按下面介绍的方法可轻松实现图层属性 ...
- @RequiresPermissions 注解说明
@RequiresAuthentication验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时.@RequiresUser验证用户是否被记忆,user有 ...