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 条评论
登录 后参与评论

相关文章

来自专栏JackeyGao的博客

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

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

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

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

2168
来自专栏杂七杂八

Matplotlib 绘2D图

Matplotlib 是一个非常简单而又完善的开源绘图库。那么它到底有多简单呢? 基本知识 首先官方文档奉上 下面,我们通过 3 行代码绘制一张简单的折线图...

6945
来自专栏数据小魔方

sparklines迷你图系列5——Evolution(Horizon)

今天跟大家分享区域(面积图)图的一个变体——水平线图。 之所以说是面积图的变体,因为这种水平线图,表达的信息与面积图几乎差不多,差别仅仅在图表呈现形式上。 ? ...

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

ios约束

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

3265
来自专栏一“技”之长

iOS界面布局之四——使用第三方库Masonry进行autolayout布局

        在前面博客,我们讨论了使用iOS原生的框架代码来进行autolayout布局。在使用中,我们会发现,无论是代码量还是结构的清晰度,都十分不能让我...

1162
来自专栏游戏杂谈

关于坐标旋转

在看<Flash actionscript动画教程>(中文版)的第十章的第二节,它提到“高级坐标旋转”,书中只给出了一个基本公式:

3052
来自专栏计算机视觉与深度学习基础

Leetcode 221. Maximal Square

Given a 2D binary matrix filled with 0's and 1's, find the largest square conta...

21010
来自专栏懒人开发

(10.5)James Stewart Calculus 5th Edition:Conic Sections

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

Masonry横向纵向排列多个控件

2003

扫码关注云+社区

领取腾讯云代金券