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函数。

  实现效果:

  

  

时间: 2024-10-25 14:37:13

openGL实现二维图形和三维图形的相关文章

C++链接库的使用,二维向量,三维向量,Ubuntu下C++测试向量库

1.#include<iostream> using namespace std; int main() { cout<<"Hello Woeld"<<endl; return 0; } 2.vector.cxx #include<iostream> int main() {int k; char x; cout<<"请输入向量的维度:"<<endl; cin>>k; vector

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

java 二维数组,三维数组 ,糊糙数组,多维数组示例代码

package org.rui.array; import java.util.Arrays; /** * 三维数组示例 * @author lenovo * */ public class ThreeDWithNew { public static void main(String[] args) { int[][][] a=new int[2][2][4]; System.out.println(Arrays.deepToString(a)); } } /** * output: * [[[

JAVA的 一维数组、二维数组、三维数组、多维数组等。

这个数组可以看做新手学习,从一维数组 到 多维 数组 循环渐进,其实看起也很简单,一看便知,众所周知,一维.二维或许经常用到,用到二维以上应该就很少了. public class test { public static void main(String[] args) { /*一维数组*/ int num[] = {0,1,2}; /*下面输出 3 行数据,0 ~ 2*/ for (int i = 0; i < num.length; i++) { System.out.println("

[OpenGL] 简单二维粒子系统——烟花,喷水,落叶

参考代码:http://download.csdn.net/detail/blue6333589/6785389 在这个代码的基础上扩展了二维粒子系统的框架,该系统由一个发射器类和一个粒子类组成,作为编程练习而言,我们只实现了最基本的粒子系统功能,但是已经可以做出一些效果了. 在这里,通过调节参数给出了在这个框架下烟花.喷水.落叶的代码,参考代码实现的是飘雪:只要在物理参数模拟和贴图选择上做得足够好,也可以实现火焰.爆炸等效果. 发射器 其中发射器类支持从点发射和从直线发射,暂时不支持曲线(编程

SuperMap 二维地图和三维场景弹窗窗口大小控制

注:此处所说的弹窗窗口,主要指的是那些弹窗窗口中嵌入iframe,包含信息页面的窗口大小控制. 1.首先来了解下 SuperMap 示例中的处理方案 二维的处理方式 1 //初始化Anchored类 2 popup = new SuperMap.Popup.Anchored( 3 "chicken", 4 marker.getLonLat(), 5 new SuperMap.Size(220,140), 6 "<iframe frameborder=no border=

matlab 画二维图与三维图

二维图 ezplot('sin(x)');%默认范围 ezplot('sin(x)',[-4 4]);%自己设定范围 三维图 ezmesh('x*x+y*y');%默认范围

卷积神经网络(CNN)之一维卷积、二维卷积、三维卷积详解

由于计算机视觉的大红大紫,二维卷积的用处范围最广.因此本文首先介绍二维卷积,之后再介绍一维卷积与三维卷积的具体流程,并描述其各自的具体应用. 二维卷积 一维卷积 三维卷积 原文地址:https://www.cnblogs.com/szxspark/p/8445327.html

【WPF】用三角形网格构建三维图形

虽然WPF只能支持部分三维模型,不过从应用功能开发的角度看,也已经够用了(非游戏开发).WPF 的三维图形,说得简单一点,也就两种而已. 1.把二维对象放到三维空间中,这个应该较为好办,像 Image 控件,Shape 类型等,或者我们常用的一些控件,都可以放进三维空间中,用这种方式构建模型可能更为实用,也好弄(至少不借助专门的建模工具的前提下). 2.完全利用坐标建模.实际上是用 N 个三角形来组合成三维模型. 虽然你会看到基类型 Visual3D 派生出了好几个类型,但总体上说也就划分为上述