使用opengl制作一个简单的由线组成的荡漾的水波

先说一下大题思路:水波,我们取出他的横切面其实就是一条曲线,所以在绘制的时候我们可以使用多个三角函数以及其他函数的叠加来实现这条曲线,我们从上到下去看这个水波,其实就是一个圆,可以理解是n个横切面的合成。综上所述,所以我们可以直接构造多条曲线去合成我们的水波,至于使波纹往外边荡漾出去,我们通过每个切面的位移来实现。

说回代码实现,首先,通过glutInit(&argc, argv)进行初始化,然后设置窗口位置和大小,和标题,接着调用一个glutReshapeFunc调用自己写的myReshape去规定视图:

1 void myReshape(GLsizei w, GLsizei h) {
2     // if the height is large than w, we should use the glViewport to adjust it
3     if (w < h) {
4         glViewport(0, 0, w, w);
5     } else {
6         glViewport(0, 0, w, h);
7     }
8 }

然后使用glutDisplayFunc去调用你的display函数去绘制图形:

 1 void myDisplay(void) {
 2     GLfloat x;
 3     //set the backgroud color
 4     glClearColor(0.7f, 0.7f, 0.7f, 1.0f);
 5     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 6     //set the point we look it
 7     glMatrixMode(GL_MODELVIEW);
 8     //replaces the current matrix with the identity matrix
 9     glLoadIdentity();
10     gluLookAt(0, -0.5, 0.4, 0, 0, 0, 0, 0, 0.5);
11
12     glBegin(GL_LINES);
13     //set the color of the line
14     glColor3f(0.5f, 1.0f, 1.0f);
15     //draw the line
16     for (float i = 0.0f; i < 360.0; i += 3.0) {
17         for (x = 0; x < 1.0f / factor; x += 0.01f) {
18                 glVertex3f(x*factor*cos(i), cos(2 * x-num)*factor, x*factor*sin(i));
19         }
20     }
21     glEnd();
22     glFlush();
23     glutSwapBuffers();
24 }

其中 glClearColor(0.7f, 0.7f, 0.7f, 1.0f) 是规定了背景颜色。 gluLookAt(0, -0.5, 0.4, 0, 0, 0, 0, 0, 0.5)规定了你的视角,就是你从哪个角度去看。注意,这里要加上glMatrixMode(GL_MODELVIEW) 和glLoadIdentity(),前一个规定了处理模式,第二行是恢复初始坐标系,不加的话绘出的图像会很怪(参见http://blog.csdn.net/shuaihj/article/details/7228265)。

画图的时候我设置了线的颜色为0.5f, 1.0f, 1.0f, 然后通过一个for循环画120条线,对于每条线,都是以坐标原点为起点,x*factor*cos(i)为X轴坐标,x*factor*sin(i)为Z轴坐标,cos(2 * x-num)*factor为y轴坐标,水波荡漾的效果就是通过改变num的值,实现不断位移实现的。glutSwapBuffers()用于实现双缓冲,这样子动画效果更好,不卡顿。

为了实现动画,用glutIdleFunc调用你的动画函数spinCube:

1 void spinCube() {
2     num = num + 0.1;
3     glutPostRedisplay();
4 }

glutPostRedisplay 标记当前窗口需要重新绘制,num用于改变每次循环时候的位移位置。

最后调用glutMainLoop()进行循环即可大功告成。

效果如下(截图看不出荡漾效果):

  

详细代码如下:

 1 #include <GL/glut.h>
 2 #include <math.h>
 3
 4 const GLfloat factor = 0.1f;
 5 GLfloat num = 0.0f;
 6 void myDisplay(void) {
 7     GLfloat x;
 8     //set the backgroud color
 9     glClearColor(0.7f, 0.7f, 0.7f, 1.0f);
10     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
11     //set the point we look it
12     glMatrixMode(GL_MODELVIEW);
13     //replaces the current matrix with the identity matrix
14     glLoadIdentity();
15     gluLookAt(0, -0.5, 0.4, 0, 0, 0, 0, 0, 0.5);
16
17     glBegin(GL_LINES);
18     //set the color of the line
19     glColor3f(0.5f, 1.0f, 1.0f);
20     //draw the line
21     for (float i = 0.0f; i < 360.0; i += 3.0) {
22         for (x = 0; x < 1.0f / factor; x += 0.01f) {
23                 glVertex3f(x*factor*cos(i), cos(2 * x-num)*factor, x*factor*sin(i));
24         }
25     }
26     glEnd();
27     glFlush();
28     glutSwapBuffers();
29 }
30
31 void spinCube() {
32     num = num + 0.1;
33     glutPostRedisplay();
34 }
35
36 void myReshape(GLsizei w, GLsizei h) {
37     // if the height is large than w, we should use the glViewport to adjust it
38     if (w < h) {
39         glViewport(0, 0, w, w);
40     } else {
41         glViewport(0, 0, w, h);
42     }
43 }
44
45 int main(int argc, char *argv[]) {
46     // init
47     glutInit(&argc, argv);
48     //set mode
49     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
50     //set the position
51     glutInitWindowPosition(100, 100);
52     //set the width and weigth
53     glutInitWindowSize(1200, 700);
54     glutCreateWindow("很荡漾的水波");
55     glutReshapeFunc(myReshape);
56     glutDisplayFunc(&myDisplay);
57     //to set the action
58     glutIdleFunc(spinCube);
59     //loop
60     glutMainLoop();
61     return 0;
62 }
时间: 2024-10-11 23:35:14

使用opengl制作一个简单的由线组成的荡漾的水波的相关文章

iOS 制作一个简单的画板

制作简单画板 作为iOS初学者,在学习完UI的几个简单控件(UILable,UITextField,UIButton)之后,就可以制作一个简单的画图板demo,以下是具体制作流程(在MRC下),如有不足之处,还请各位大神们指教 0.0. 1.搭建界面,主要由UIButton,UITextField组成,底部的按钮是UITextField的一个自定义键盘(inputView) . - (void)viewDidLoad { [super viewDidLoad]; //创建菜单按钮 UIButto

制作一个简单的文本框输入的网页

题目:制作一个简单的网页(包含一个文本框.一个按钮),在页面上输出用户在文本框输入的内容,要求用JavaScript获取文本框内容. 一.首先利用html在网页上制作表单,代码如下: **onclick事件:onclick 事件会在对象被点击时发生. 二.利用js获取输入信息,并将其输出: 相关知识: 1.给用户确认消息,真正实现交互,使用语句confirm();给用户提示信息,实现单向通信,使用语句alert(). 三.运行结果: 1.用浏览器打开结果如下: 2.输入文本框内容,点击[提交]:

c# 自己制作一个简单的项目倒计时器

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace date { public partial class Form1 : Form { public Form1() { InitializeCompo

如何使用AEditor制作一个简单的H5交互页demo

转载自:http://www.alloyteam.com/2015/06/h5-jiao-hu-ye-bian-ji-qi-aeditor-jie-shao/ 本教程演示如何使用AEditor制作一个简单的H5交互页demo: 交互页demo地址: 点击打开H5交互页demo AEditor访问地址: http://aeditor.alloyteam.com Step1:设置页面背景颜色 首先我们设置页面的背景颜色,右击舞台点击“设置背景”: 然后在背景颜色中填上色值rgb(38, 61, 10

制作一个简单的用户界面

制作一个简单的用户界面 这节课里面,我们来开发一个XML布局文件,这个布局文件里面会包含一个text field,文本输入框,和一个按钮button.下一节课里面,会教大家怎么在按下一个按钮的时候,跳转到另一个Activity. 这里先简单解释一下Android界面的构成.AndroidApp的界面是使用View和ViewGroup构建起来的.View通常就是我们常见的UI小部件,比如按钮Button.文本控件TextView等:而ViewGroup是一个View的容器,它可以限制这个容器里面的

【FLEX&amp;YACC】第二天制作一个简单计算器

首先写词法分析器: 词法分析器要返回记号: "+" 返回ADD "-" 返回SUB "*" 返回MUL "/" 返回DIV 输入的实数全部被当作double类型处理 换行符返回CR calc.l: %{#include <stdio.h>#include "y.tab.h"int yywrap(void){ /*免链接库文件*/    return 1;}%}%%[ \t]    { ;}&qu

实例学习SSIS(一)--制作一个简单的ETL包

原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SSIS(四)--使用日志记录和错误流重定向 实例学习SSIS(五)--理论介绍SSIS 参考内容:SQLServer2005的帮助文档. ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/sqltut9/html/d6d5bb1f-4cb1-4605-9cd6-f60

利用PHP内置函数制作一个简单的验证码

因为这两天学习了一些PHP的内置函数,所以今天就用一些内置函数配合数组来简单的制作一个随机验证码的效果. 例如:2dT5     T22c.... 分析:首先分析验证码的组成: 1.验证码是由数字1-9,大写字母A-Z,小写字母a-z 中随机生成的. 2.我先创建一个包含指定范围单元的数组.(这里应该是三个:数字,大写字母,小写字母). 3.我可以将这些数组合并成一个大的数组 4.随机打乱该函数.ps:其实觉得在这里再做一步将数组随机打乱,感觉也没有什么必要啊!因为后面我们做的不也是随机抽取吗?

怎样用HTML5 Canvas制作一个简单的游戏

为了让大家清楚HTML5制作游戏的简单流程,所以先了制作一个非常简单的游戏,来看一看这个过程.   游戏非常简单,无非就是英雄抓住怪物就得分,然后游戏重新开始,怪物出现在地图的随机位置,英雄初始化在地图的中间.点击[这里](../simple_canvas_game-master/index.html "simple_canvas_game"),我们可以直接先玩玩这个游戏 ![simple_game](Figure/1_simple_game.png) ## 1. 创建一个Canvas