4.4.2 OpenGL几何变换编程实例

程序运行结果如下图:

#include <GL/glut.h>

#include <stdlib.h>

#include <math.h>

/* 初始化显示窗口大小 */

GLsizei winWidth=600,winHeight=600;

/* 设置世界坐标系的显示范围 */

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=50;

centroidPt.y=100;

centroidPt.z=0;

R_p1=centroidPt;

R_p2.x=50;

R_p2.y=100;

R_p2.z=1;

/* 设置几何变换参数*/

wcPt3D p1,p2,fixedPt;

p1= R_p1;

p2= R_p2;

fixedPt=centroidPt;

GLfloat tx=0.0,ty=100.0,tz=0;

GLfloat sx=0.5,sy=0.5,sz=1;

GLdouble thetaDegrees = 90;

glClear(GL_COLOR_BUFFER_BIT); // 清空显示窗口

glMatrixMode (GL_MODELVIEW);

glLoadIdentity(); //清空变换矩阵为单位矩阵,恢复原始坐标系环境

/* 显示变换前几何对象 */

glColor3f(0.0,0.0,1.0); // 设置前景色为蓝色

glRecti(50,100,200,150); //显示蓝色矩形(变换前)

/* 执行几何变换(注意以反序形式写出)*/

glTranslatef (tx, ty, tz); // ③平移变换

scale3D (sx, sy, sz, fixedPt); // ②比例放缩变换

rotate3D (p1, p2, thetaDegrees); // ①旋转变换

/* 显示变换后几何对象 */

glColor3f(1.0,0.0,0.0); //重新设置前景色为红色

glRecti(50,100,200,150); //显示红色矩形(变换后)

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(50,50);

glutInitWindowSize(winWidth,winHeight);

glutCreateWindow("三维几何变换实例-OpenGL版复合变换");

init();

glutDisplayFunc(displayFcn);

glutReshapeFunc(winReshapeFcn);

glutMainLoop();

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏生信技能树

用python编写验证码

作为一个用python的生信工程师,平时工作中除了用python来处理些文本文件和搭建流程,没事也想探索些其他有趣的功能。这几天就在网上学习了下如何用pytho...

3855
来自专栏ml

初学java之(盒子分布)

1 import javax.swing.*; 2 3 import java.awt.*; 4 class WinGrid extends JFr...

49410
来自专栏Android知识点总结

D4-Android绘图之和我一起画箭头

932
来自专栏逍遥剑客的游戏开发

RenderMonkey在数字图像处理中的应用

2108
来自专栏深度学习思考者

一文搞懂Matlab画图那些事(上篇)

题记:临时需要Matlab画个曲线图,突然发现有些命令竟然忘掉了,于是各种查。这里博主整理合并关于画图那些命令,只为让你轻松搞定Matlab画图这些琐事,那么,...

3287
来自专栏移动端周边技术扩展

Masonry横向纵向排列多个控件

1573
来自专栏python3

tkinter -- Label使用图像与文本

compound: 指定文本(text)与图像(bitmap(内置图)/image(自定义图片)是如何在Label上显示,当指定image/bitmap时,会显...

721
来自专栏谦谦君子修罗刀

ios约束

一、苹果的VFL语法约束 在使用约束之前,要先将没有设置frame的view添加到父视图上。如何将view设置为使用AutoLayout约束,取消默认约束。 ...

3205
来自专栏PPV课数据科学社区

数据挖掘知识脉络与资源整理(七)–饼图

? ? 简介 饼图英文学名为Sector Graph, 有名Pie Graph。常用于统计学模块。2D饼图为圆形,手画时,常用圆规作图。 仅排列在工作表的一...

2917
来自专栏JackeyGao的博客

使用Python将两张照片透明重叠

透明重叠最主要用的是Image.blend方法(详情请看第二个代码块), 第一个代码块主要是将多个图片剪切到一张大图, 然后用这张大图和另外一张非剪切的大图进行...

2251

扫码关注云+社区