OpenGL 的学习之路-4(变换)

三大变换:平移、缩放、旋转(通过这三种变换,可以将图像移动到任意位置)

其实,这背后对应的数学在 闫令琪 图形学课程 中有过一些了解,所以,理解起来也不觉得很困难。看程序吧。

1.画三角形(运用三种变化效果)

///
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>///
void init(void) {glClearColor (0.0, 0.0, 0.0, 0.0);//glShadeModel (GL_FLAT);
}///
void draw_triangle(void) {glBegin (GL_LINE_LOOP);glVertex2f(0.0, 25.0);glVertex2f(25.0, -25.0);glVertex2f(-25.0, -25.0);glEnd();
}///
void display(void) {glClear (GL_COLOR_BUFFER_BIT);glLoadIdentity (); ///!!!!glColor3f (1.0, 1.0, 1.0);draw_triangle ();glEnable (GL_LINE_STIPPLE); ///!!!!打开画线型的开关glLineStipple (1, 0xF0F0);glLoadIdentity ();glTranslatef (-20.0, 0.0, 0.0);  ///平移draw_triangle ();glLineStipple (1, 0xF00F);glLoadIdentity ();glScalef (1.5, 0.5, 1.0);   ///缩放draw_triangle ();glLineStipple (1, 0x8888);glLoadIdentity ();glRotatef (90.0, 0.0, 0.0, 1.0);   ///旋转,第一个参数是角度,后面三个是旋转的轴draw_triangle ();glDisable (GL_LINE_STIPPLE); //*/glFlush ();
}//先不看这个
///
void reshape (int w, int h) {glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();if (w <= h)glOrtho (-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w,50.0*(GLfloat)h/(GLfloat)w, -1.0, 1.0);elseglOrtho (-50.0*(GLfloat)w/(GLfloat)h,50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);
}///
int main(int argc, char** argv) { //int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow(""); //argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;
}

运行结果:

程序分析:

知识点:

1.glLoadIdentity () 所有的变换操作是放在一个栈中的,在施加一个新变化上,该语句的作用是向栈中压入一个I(单位阵),也就是现在还无变换。方便后续操作。

2.glTranslatef (-20.0, 0.0, 0.0) 平移操作,向x轴的负半轴平移20个单位。该语句施加在前面I之上,相当于该平移变换起作用。

3.glScalef (1.5, 0.5, 1.0) 缩放操作,x轴坐标变为原来的1.5倍,y轴坐标变为原来的0.5倍。该语句施加在前面I之上,相当于该缩放变换起作用。

4.glRotatef (90.0, 0.0, 0.0, 1.0) 旋转操作,以(0,0,1)也就是z轴为旋转轴,旋转度数为90度。该语句施加在前面I之上,相当于该旋转变换起作用。

 2.变换的顺序 以及 新的语句使用

///
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <iostream>///
void myMainWinDraw(void);
void myMainWinReshape(int _width, int _height);///
int winWidth, winHeight;
int control(0);///
int main(int argc,char** argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400, 400);glutInitWindowPosition(0, 0);glutCreateWindow("Hello");glutDisplayFunc(myMainWinDraw);glutReshapeFunc(myMainWinReshape);glutMainLoop();return 0;
}//先不看这个(的作用)
///
void myMainWinReshape(int _width, int _height) {winWidth  = _width;winHeight = _height;glViewport(0, 0, _width, _height);
}///
void myMainWinDraw() {glClearColor(0.0, 0.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glPushMatrix();  //!!!glLoadIdentity();//attention: order is very important !!glRotatef(90, 0.0f, 0.0f, 1.0f); //<<===new!!glTranslatef(0.75f, 0.0, 0.0f);   //<<===new!!glutWireTeapot(0.25f);glPopMatrix();   //!!!glFlush();
}///

运行结果:

如果改变R和T的顺序:

 运行结果:

示意图:

知识点:

1.glPushMatrix() 将存着变换的栈中的栈顶矩阵复制一份再放到栈顶。

2.glLoadIdentity () 将那个栈顶的矩阵变换为单位阵 I。

3.如果有多个变换的函数,先施行的是最下面的,然后往上进行。

4.glPopMatrix() 将栈顶的矩阵弹出,这样比较安全。变换前后,保持了栈中的状态没有变化。

(以上三种变换属于模型变换) 

3.设置相机的位置

拍摄受相机的影响,影响相机的三个因素:相机的位置、相机的指向、相机的top方向。如果把相机比作人的眼睛的话,眼睛的位置、眼睛看向哪里、头的歪头。

///
///#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>#define STEP  0.01f///
double eyex, eyez, upx;///
void myDrawing(void);
void myKeyboard(unsigned char _key, int _x, int _y);
void reshape(GLsizei _wid, GLsizei _hei);///
int main(int argc,char** argv) {glutInit(&argc,argv);eyex = eyez = 0;upx  = 0;glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(300, 300);glutInitWindowPosition(400, 0);glutCreateWindow("Hello");glutDisplayFunc(myDrawing);glutKeyboardFunc(myKeyboard);glutReshapeFunc(reshape);glutMainLoop();return 0;
}///
void reshape(GLsizei _wid, GLsizei _hei) {glViewport(0, 0, _wid, _hei);glMatrixMode(GL_PROJECTION);glLoadIdentity();#if 1if (_wid<=_hei) {glOrtho(-3.0, 3.0, -3.0*_hei/_wid, 3.0*_hei/_wid, -3.0, 13.0);} else {glOrtho(-3.0*_wid/_hei, 3.0*_wid/_hei, -3.0, 3.0, -3.0, 13.0);}
#elsegluPerspective(90.0, 1.0, 0, 10.0);
#endifglMatrixMode(GL_MODELVIEW);
}///
// 图形绘制函数
void myDrawing(void) {glClearColor(0.0, 0.0, 1.0f, 0.0);  //设置背景清除蓝色glClear(GL_COLOR_BUFFER_BIT);       //执行清除glPushMatrix();glLoadIdentity();gluLookAt(eyex, 0, eyez, 0, 0, -1, upx, 1, 0);  //会在modelview矩阵上叠加glTranslatef(0.0f, 0.0f, -3.0f);glutWireTeapot(0.5f);//gluLookAt(eyex, 0, eyez, 0, 0, -1, upx, 1, 0);  //会在modelview矩阵上叠加----顺序glPopMatrix();glFlush();
}///
// 键盘事件处理函数               <==========NEW!!!
void myKeyboard(unsigned char _key, int _x, int _y) {switch (_key) {case 'w': eyex += STEP; break;case 's': eyex -= STEP; break;case 'r': eyez += STEP; break;case 'f': eyez -= STEP; break;case 'e': upx += STEP; break;case 'd': upx -= STEP; break;}glutPostRedisplay();
}

 知识点:

1.gluLookAtt(eyex, 0, eyez, 0, 0, -1, upx, 1, 0) 9个参数,三个一组,前三个是相机的位置,中间三个是相机看向的方向,后三个是相机的top方向。这里,一开始,相机位于原点位置,相机看向z轴负半轴(也就是屏幕里),相机的top方向是y轴的正方向。

2.这里使用了键盘事件处理的回调函数 来实现 漫游(相机的移动)。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/192419.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FISCO BCOS 3.0【02】配置和使用系统自带的控制台

官方技术文档&#xff1a;https://fisco-bcos-doc.readthedocs.io/zh-cn/latest/index.html 我们在官方技术文档的基础上&#xff0c;进行&#xff0c;对文档中一些不清楚的地方进行修正 控制台提供了向FISCO BCOS节点部署合约、发起合约调用、查询链状态等功能。 第一步. 安…

Spring对事务的实现

Spring对事务的支持 事务概述事务的四个处理过程事务的四个特性 引入事务场景Spring实现事务的两种方式声明式事务之注解实现方式 事务概述 在一个业务流程当中&#xff0c;通常需要多条DML&#xff08;insert delete update&#xff09;语句共同联合才能完成&#xff0c;这多…

YOLOv8-Seg改进:渐近特征金字塔网络(AFPN)

🚀🚀🚀本文改进:AFPN通过融合两个相邻的Low-Level特征来启动的,并渐进地将High-Level特征纳入融合过程,提升分割能力。 🚀🚀🚀AFPN小目标分割首选,暴力涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻…

口袋参谋:一键下载任意买家秀图片、视频,是怎么做到的!

​对于淘宝商家来说&#xff0c;淘宝买家秀是非常的重要的。买家秀特别好看的话&#xff0c;对于提升商品的销量来说&#xff0c;会有一定的帮助&#xff0c;如何下载别人的买家秀图片&#xff0c;然后用到自己的店铺中呢&#xff1f; 这里我可以教叫你们一个办法&#xff01;那…

C语言之for while语句详解

C语言之for while语句详解 文章目录 C语言之for while语句详解简介1 while语句1.1while语句的格式1.2 while语句的实践 2 for2.1 for语句格式2.2 for循环的实践 3 do while3.1 do while语句格式3.2 do while循环的实践 3 循环中break和continue3.1 while语句中的break和continu…

DGL如何表征一张图

有关于DGL中图的构建 DGL 将有向图表示为一个 DGL 图对象。图中的节点编号连续&#xff0c;从0开始。我们一般通过指定图中的节点数&#xff0c;以及源节点和目标节点的列表&#xff0c;来构建这么一个图。 下面的代码构造了一个图&#xff0c;这个图有五个叶子节点。中心节点…

java并发编程JUC:一、专栏配置+进程与线程+并行和并发+同步和异步+线程的创建、调用、查看、运行原理和相关API

专栏配置 pom.xml <properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies><dependency><groupId>org.projectlombok<…

Python与ArcGIS系列(九)自定义python地理处理工具

目录 0 简述1 创建自定义地理处理工具2 创建python工具箱0 简述 在arcgis中可以进行自定义工具箱,将脚本嵌入到自定义的可交互窗口工具中。本篇将介绍如何利用arcpy实现创建自定义地理处理工具以及创建python工具箱。 1 创建自定义地理处理工具 在arctoolbox中的自定义工具箱…

Java的IO流-缓冲流

字节缓冲流 package com.itheima.d2;import java.io.*;public class Test1 {public static void main(String[] args) {try (InputStream is new FileInputStream("IO/src/itheima01.txt");//1、定义一个字节缓冲输入流包装原始的字节输入流InputStream bis new Bu…

Flutter 3.16 中带来的更新

Flutter 3.16 中带来的更新 目 录 1. 概述2. 框架更新2.1 Material 3 成为新默认2.2 支持 Material 3 动画2.3 TextScaler2.4 SelectionArea 更新2.5 MatrixTransition 动画2.6 滚动更新2.7 在编辑菜单中添加附加选项2.8 PaintPattern 添加到 flutter_test 3. 引擎更新&#xf…

97.qt qml-自定义Table之实现ctrl与shift多选

我们之前实现了:93.qt qml-自定义Table优化(新增:水平拖拽/缩放自适应/选择使能/自定义委托)-CSDN博客 实现选择使能的时候,我们只能一行行去点击选中,非常麻烦,所以本章我们实现ctrl多选与shift多选、 所以在Table控件新增两个属性: 1.实现介绍 ctrl多选实现原理:当我…

基于乌燕鸥算法优化概率神经网络PNN的分类预测 - 附代码

基于乌燕鸥算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于乌燕鸥算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于乌燕鸥优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…