openGL实现二维图形和三维图形
openGL是一个强大的底层图形库,其命令最初的时候使用C语言实现的。openGL定义了一个图形程序接口,常用于制作处理三维图像,功能强大,调用方便,在图像处理十分受欢迎。
实现图形主要使用的是openGL的一个工具包:GLUT。
GLUT (pronounced like the glut in gluttony) is the OpenGL Utility Toolkit, a window system independent toolkit for writing OpenGL programs. It implements a simple windowing application programming interface (API) for OpenGL.
GLUT is designed for constructing small to medium sized OpenGL programs. While GLUT is well-suited to learning OpenGL and developing simple OpenGL applications, GLUT is not a full-featured toolkit so large applications requiring sophisticated user interfaces are better off using native window system toolkits like Motif. GLUT is simple, easy, and small.
GLUT对于大型的项目来说可能功能不全,它主要针对一些中小型的openGL项目而设计。
1.实现二维图像相对简单些,直接下代码:
- #include <GL/glut.h>
- void Rectangle(void) {
- //gl开头的函数为openGL的标准函数
- //(使用当前缓冲区的值来)清除指定的缓冲区
- glClear(GL_COLOR_BUFFER_BIT);
//画矩形- //glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
- //画直线
- glBegin(GL_LINES);
- glVertex2f(0.5f, 0.5f);
- glVertex2f(-0.5f, -0.5f);
- glEnd();
- //刷新缓冲,保证绘图命令能被执行
- glFlush();
- }
- int main(int argc, char *argv[]) {
- //初始化GLUT library
- glutInit(&argc, argv);
- //对窗口的大小进行初始化
- glutInitWindowSize(300, 300);
- // 设置窗口出现的位置
- //glutInitWindowPosition(int x, int y);
- //初始化程序展示模式
- glutInitDisplayMode(GLUT_RGBA);
- glutCreateWindow("project of openGL");
- //win: 指定子窗口的父窗口
- //glutCreateSubWindow(int win, int x, int y, int width, int height);
- //为当前窗口设置函数回调,用于画图
- glutDisplayFunc(&Rectangle);
- //进行glut事件循环,否则看不到图形效果(一闪而过)
- glutMainLoop();
- return 0;
- }
实现效果:
也可以在窗口中画一个圆:
- #include <math.h>
GLfloat r = 0.5f;- GLfloat PI = 3.141592653f;
- int pre = 30;
- glBegin(GL_POLYGON);//画多边形
- for (int i = 0; i < pre; i++) {
- glVertex2f(r * cos(2 * PI*i / pre), r * sin(2 * PI*i / pre));
- }
- glEnd();
实际上这个圆并不是圆,而是多边形的近似。GL_POLYGON用于绘制多边形,边数达到一定程度,显示出来的形状近似于圆。
2.接下来来实现三维图像Cube。
三维变换:
模型视图变换(GL_MODELVIEW):从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。
透视投影变换(GL_PROJECTION):定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上。
视口变换(glViewPort):通常情况下,程序默认像素填充整个窗口,通过视口变换设置像素在窗口上的填充情况。
每次对物体进行变换的时候,都需要先设置当前操作的矩阵为某种变换的矩阵,在进行变换之前还需要将矩阵转换为单位矩阵才能进行操作。
- glMatrixMode(GL_PROJECTION);
glLoadIdentity();
完整代码:
- #include <GL/glut.h>
- #include <math.h>
- void setCube(void) {
- glClearColor(1.0, 1.0, 1.0, 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
- glColor3f(0, 0, 0);//设置黑色
- glLoadIdentity();//加载单位矩阵
- gluLookAt(6, 0, 2.5, 0, 0, 0, 1, 1, 0);
- //前三个参数设置观察者的观察位置,中三个参数设置观察点的位置,后三个参数设置观察者的观察方向
- glLineWidth(2.0f);//设置边的像素宽,默认为1.0f
- glutWireCube(2.0);
- glFlush();
- }
- void drawCube(void) {
- glClearColor(1.0, 1.0, 1.0, 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
- glLoadIdentity();
- gluLookAt(4, 0, 1.5, 0, 0, 0, 1, 1, 0);
- //绘制正方体的面
- glColor3f(0, 1, 0);
- glBegin(GL_QUADS);
- //---1---
- glNormal3f(-1, 0, 0);//设置点的法向量
- glVertex3f(0.5, 0.5, 0.5);
- glVertex3f(0.5, -0.5, 0.5);
- glVertex3f(0.5, -0.5, -0.5);
- glVertex3f(0.5, 0.5, -0.5);
- //---2---
- glNormal3f(-1, 0, 0);
- glVertex3f(-0.5, 0.5, 0.5);
- glVertex3f(-0.5, -0.5, 0.5);
- glVertex3f(-0.5, -0.5, -0.5);
- glVertex3f(-0.5, 0.5, -0.5);
- //---3---
- glNormal3f(0, 1, 0);
- glVertex3f(0.5, 0.5, 0.5);
- glVertex3f(-0.5, 0.5, 0.5);
- glVertex3f(-0.5, 0.5, -0.5);
- glVertex3f(0.5, 0.5, -0.5);
- //---4---
- glNormal3f(0, -1, 0);
- glVertex3f(0.5, -0.5, 0.5);
- glVertex3f(-0.5, -0.5, 0.5);
- glVertex3f(-0.5, -0.5, -0.5);
- glVertex3f(0.5, -0.5, -0.5);
- //---5---
- glNormal3f(0, 0, 1);
- glVertex3f(0.5, 0.5, 0.5);
- glVertex3f(-0.5, 0.5, 0.5);
- glVertex3f(-0.5, -0.5, 0.5);
- glVertex3f(0.5, -0.5, 0.5);
- //---6---
- glNormal3f(0, 0, -1);
- glVertex3f(0.5, 0.5, 0.5);
- glVertex3f(-0.5, 0.5, 0.5);
- glVertex3f(-0.5, -0.5, 0.5);
- glVertex3f(0.5, -0.5, 0.5);
- glEnd();
- //draw
- glColor3f(0, 0, 0);
- glLineWidth(2.0f);
- //绘制正方体的边
- glBegin(GL_LINES);
- //---1---
- glVertex3f(0.5, 0.5, 0.5);
- glVertex3f(-0.5, 0.5, 0.5);
- glVertex3f(-0.5, 0.5, 0.5);
- glVertex3f(-0.5, -0.5, 0.5);
- glVertex3f(-0.5, -0.5, 0.5);
- glVertex3f(0.5, -0.5, 0.5);
- glVertex3f(0.5, -0.5, 0.5);
- glVertex3f(0.5, 0.5, 0.5);
- //---2---
- glVertex3f(0.5, 0.5, -0.5);
- glVertex3f(-0.5, 0.5, -0.5);
- glVertex3f(-0.5, 0.5, -0.5);
- glVertex3f(-0.5, -0.5, -0.5);
- glVertex3f(-0.5, -0.5, -0.5);
- glVertex3f(0.5, -0.5, -0.5);
- glVertex3f(0.5, -0.5, -0.5);
- glVertex3f(0.5, 0.5, -0.5);
- //---3---
- glVertex3f(0.5, 0.5, 0.5);
- glVertex3f(0.5, -0.5, 0.5);
- glVertex3f(0.5, -0.5, 0.5);
- glVertex3f(0.5, -0.5, -0.5);
- glVertex3f(0.5, -0.5, -0.5);
- glVertex3f(0.5, 0.5, -0.5);
- glVertex3f(0.5, 0.5, -0.5);
- glVertex3f(0.5, 0.5, 0.5);
- //---4---
- glVertex3f(-0.5, 0.5, 0.5);
- glVertex3f(-0.5, -0.5, 0.5);
- glVertex3f(-0.5, -0.5, 0.5);
- glVertex3f(-0.5, -0.5, -0.5);
- glVertex3f(-0.5, -0.5, -0.5);
- glVertex3f(-0.5, 0.5, -0.5);
- glVertex3f(-0.5, 0.5, -0.5);
- glVertex3f(-0.5, 0.5, 0.5);
- glEnd();
- glFlush();
- }
- void threeD(int w, int h) {
- glViewport(0, 0, (GLsizei)w, (GLsizei)h);//调整视图窗口大小
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 10.0);
- glMatrixMode(GL_MODELVIEW);
- }
- int main(int argc, char *argv[]) {
- //初始化GLUT library
- glutInit(&argc, argv);
- //对窗口的大小进行初始化
- glutInitWindowSize(500, 500);
- // 设置窗口出现的位置
- //glutInitWindowPosition(int x, int y);
- //初始化程序展示模式
- glutInitDisplayMode(GLUT_RGBA);
- glutCreateWindow("project of openGL");
- //为当前窗口设置函数回调,用于画图
- glutDisplayFunc(drawCube);
- //窗口改变时的函数
- glutReshapeFunc(threeD);
- glutMainLoop();
- return 0;
- }
可以调用openGL的glutWireCube(GLFloat size)来绘制立体正方形,如setCube函数。
我想要实现带有黑色边缘的绿色正方体,必须对正方体进行绘制,如drawCube函数。
实现效果:
openGL实现二维图形和三维图形的更多相关文章
- OpenGL屏幕二维坐标转化成三维模型坐标
我们把OpenGL里模型的三维坐标往二维坐标的转化称为投影,则屏幕上的二维坐标往三维坐标转化则可以称为反投影,下面我们来介绍一下反投影的方法. 主要是gluUnProject函数的使用,下面是代码: ...
- TurboCAD Pro for Mac(二维绘图和三维建模工具)破解版安装
1.软件简介 TurboCAD Pro 是 macOS 系统上一款二维绘图和三维建模工具,具备强大的绘图和设计特性,加上强大的创建复杂的三维模型的工具,三维 OpenGL 的渲染,和超过 11, ...
- php基础------将二维数组转三维数组
将二维数组转为三维数组 /** * 二维数组转三维数组(指定键为三维数组的键名) * @param [type] $arr [要排序的数组] * @param [type] $key [指定的键] * ...
- UWP开发-二维变换以及三维变换
在开发中,由于某些需求,我们可能需要做一些平移,缩放,旋转甚至三维变换,所以我来讲讲在UWP中这些变换的实现方法. 一. 二维变换: UIElement.RenderTransform a.Trans ...
- SuperMap 二维地图和三维场景弹窗窗口大小控制
注:此处所说的弹窗窗口,主要指的是那些弹窗窗口中嵌入iframe,包含信息页面的窗口大小控制. 1.首先来了解下 SuperMap 示例中的处理方案 二维的处理方式 //初始化Anchored类 po ...
- matlab 画二维图与三维图
二维图 ezplot('sin(x)');%默认范围 ezplot('sin(x)',[-4 4]);%自己设定范围 三维图 ezmesh('x*x+y*y');%默认范围
- 卷积神经网络(CNN)之一维卷积、二维卷积、三维卷积详解
作者:szx_spark 由于计算机视觉的大红大紫,二维卷积的用处范围最广.因此本文首先介绍二维卷积,之后再介绍一维卷积与三维卷积的具体流程,并描述其各自的具体应用. 1. 二维卷积 图中的输入的数据 ...
- 数组(Array),二维数组,三维数组
数组(Array):相同类型数据的集合就叫做数组. (一)定义数组的方法: A) type[] 变量名 = new type[数组中元素的个数] 例如: int[] a = new int[10] ; ...
- MATLAB二维插值和三维插值
插值问题描述:已知一个函数上的若干点,但函数具体表达式未知,现在要利用已知的若干点求在其他点处的函数值,这个过程就是插值的过程. 1.一维插值 一维插值就是给出y=f(x)上的点(x1,y1),(x2 ...
随机推荐
- 提交按钮ajax方式
function doSubmit2(){ $("#formobj").form("submit", { url : "sjsCorporationC ...
- Angular2 组件通信
1. 组件通信 我们知道Angular2应用程序实际上是有很多父子组价组成的组件树,因此,了解组件之间如何通信,特别是父子组件之间,对编写Angular2应用程序具有十分重要的意义,通常来讲,组件之间 ...
- 定时器setInterval 开始、暂停、继续!
活不多说,最近写这个定时器,,遇到了一些问题.然后上网百度.避免以后朋友遇到类似问题.贴出代码.... 最主要就是定义全局变量. 下面重要的我红色 标注出来. 批注:如 赋值代码,请给出源码地址.O( ...
- Java学习笔记__异常机制_try_catch_finally_return执行顺序
package cn.xiaocangtian.Exception; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...
- js原声快速实现选项卡
var Rea = document.getElementById("rep"); var ReaAll = Rea.querySelectorAll("li" ...
- MongoVue中Collections无法显示的问题
问题描述: 通过Python向MongoDB写入数据后,MongoVue中Collections无法显示的问题 原因: Mongodb 3.0之后默认的 storageEngine为wiredTige ...
- MongoDB 安装及其配置
安装: 安装路径d:MongoDB较短便于后续操作 配置: 1.新建data文件夹并在data文件夹下新建db和log文件夹,路径如下 MongoDB\data\db MongoDB\data\log ...
- 【Java并发系列01】Thread及ThreadGroup杂谈
img { border: solid black 1px } 一.前言 最近开始学习Java并发编程,把学习过程记录下.估计不是那么系统,主要应该是Java API的介绍(不涉及最基础的概念介绍), ...
- Linux IPTABLES端口转发
之前在Linux上用普通用户部署了一个Tomcat,然后将其server.xml中的端口配置为80端口,用普通用户运行就提示绑定端口失败(permission denied),google了一下,原来 ...
- python-opencv笔记 图像的读取和简单几何图形绘制