第二篇:2d图形绘制

从小学开始,我们就学习了点,线,面,三角形,矩形等几何图形,这些在openFrameworks里面是怎么实现的呢?

一:绘制基本几何图形

        打开projectGenerator-vs\projectGenerator.exe,弹出对话框

点击Generate,在VS中打开程序,在ofApp.cpp中,void ofApp::draw{  }中写上一行代码:ofLine(0,0,600,600) 运行就可以出现一条直线

ofLine(0,0,600,600)这行代码调用的是 ofLine(x1,y1,x2,y2)函数。表示从x1,y1这个点为起点,x2,y2为终点,在他们之间画直线。

openFrameworks提供了很多类似的2d图形绘制函数。

ofRect( x, y, w, h ): 绘制矩形,以x,y 为起点,画一个宽为w,高为h的矩形。

ofTriangle( x1, y1, x2, y2, x3, y3 ): 绘制三角形,以三个点  point1(x1,y1)、point2(x2,y2)、point3(x3,y3)为顶点画三角形。

ofCircle( x, y, r ):绘制圆。以点point(x,y)为圆心,r为半径画圆。

运行范例:

目前为止,我们能画一些简单的几何图形,但是这些图形颜色怎么都是白色的,背景色又总是灰色呢,可不可以自定义呢?为此openFrameworks为我们提供了以下函数:

ofBackground( r, g, b ). 设置背景颜色。r,g,b代表红,绿,蓝三种颜色值。取值范围是0—255.

ofSetColor(r,g,b) :设置绘图颜色。利用这两个函数,就可以绘制彩色图形了。

 

 

ofSetLineWidth(float linewidth);设置线段的粗细。

ofNoFill()   不填充模式,仅显示边框。

ofFill() 填充模式,这是默认模式。边框和内部一起显示。

ofSetCircleResolution(int res);设置圆的平滑度,圆弧可以看成是一段段直线连接起来的,线段越多,弧度越平滑。默认情况下,画出来的圆并不平滑,需要设置多点的线段才平滑。

加上新的代码,运行如下:

二:让图形动起来。

上面设置的基本图形中,函数里都是固定值,因此,图形的位置都是静止不动的。想要图形动起来,必须让函数里的值不断变化。因此要设置一个变量x,想办法让x值不断变化。

 

设置一个全局变量  int x;

在 setup()初始化   x=600; 在update()里,x=x+1  把原来ofCircle(600, 400, 100);改成ofCircle(x, 400, 100); 运行后可以看到绿色的圆形从左到右快速移动,直至消失。X值不断的加大。为什么在update()函数里,x值能不断的自己增加呢,这得从src代码运行机制说起。

 

三:openFrameworks代码运行机制。

在src下有三个源文件,分别是ofApp.h  ofApp.cpp main.cpp   .h文件为c++头文件  .cpp为c++实现文件。main为主程序入口。程序运行后,先找到main.cpp 在main中默认有 ofSetupOpenGL(1024,768,OF_WINDOW); ofRunApp(new ofApp());  

ofSetupOpenGL(int w,int h,ofWindowModel screenModel):设置窗口大小和屏幕模式,有窗口和全屏两种模式。

ofRunApp(new ofApp()):运行 ofApp工程。接着进入 ofApp文件了。

在ofApp.h头文件可以看到一些默认自定义函数。这些函数是:

void setup(); 创建初始化,一些变量初始化放在这个函数里。

void update();更新,一些需要变化的值放在这里,如上面的x=x+1,表示随着时间不断变化,x值一直加1增大。

 

void draw();绘制,所有的绘制函数都在draw()里面写。

 

这三个函数是一个流程,先setup,再update,最后draw。构成了openFrameworks代码的生命周期。不断循环刷新屏幕,因此我们可以在屏幕上一直看到图形。刷新的频率默认情况下是1秒60帧。我们可以通过ofSetFrameRate( rate ):设置刷新率,当把rate数值改变后,观察下圆形的移动速度有没有什么变化。

四:坐标系统转换,移动,放大缩小,旋转。

主要有5个函数:

ofPushMatrix():把当前的坐标系统放入一个Matrix栈里。简称入栈。

ofPopMatrix():把最后的坐标系统从Matrix栈里取出,简称出栈。

变化三件套(移动,放大缩小,旋转)等都在入栈和出栈中间操作。

ofTranslate( x, y)   移动到 新的 x,y点

ofScale( scaleX, scaleY ):  放大缩小。 scaleX为x轴值,scaleY为y轴值。openFrameworks默认坐标是以左上角为(0,0)原点。X向右增大,y向下增大。

ofRotate( angle ): 旋转。Angle是角度,取值范围是0到k*360之间。

 

五:更多的数学求值,运动更丰富。

除了直线运动,移动,放大缩小,旋转外,openFrameworks还为我们提供了更多的不规则运动,这些函数都在libs\openFrameworks\math库里。

ofMap( v, v0, v1, out0, out1 )

ofClamp( v, v0, v1 ):

ofRandom( a, b ):

ofNoise ( x )

ofGetElapsedTimef():

 

通过这些函数的设置,圆形可以获得更丰富的运动轨迹。如:随机,抖动等。喜欢尝试的小伙伴可以自己动手试试。