正玄波浪曲线的特点是一个周期在x(0-360°)之间,y在(-1,+1)之间移动
其中y=sinx
假定移动一个周期X变化位置0~10,Y的变化位置5~-5,那么可推断出
X=(10-0)/360.0*a 其中a代表角度
Y=sin(a)*5/1
关于C++函数库中算数公式的使用
SIN(弧度)
弧度=PI/180.0f*a 其中a代表角度
\
#include "header.h" GLuint texture[1]; #define PI 3.141592654 float quar=1.0f; AUX_RGBImageRec *LoadBMP(char *Filename) { FILE *File=NULL; if (!Filename) { return NULL; } File=fopen(Filename,"r"); if (File) { fclose(File); return auxDIBImageLoad(Filename); } return NULL; } int LoadGLTextures() { int Status=FALSE; AUX_RGBImageRec *TextureImage[1]; memset(TextureImage,0,sizeof(void *)*1); if (TextureImage[0]=LoadBMP("Data/Star.bmp")) { Status=TRUE; glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); } if (TextureImage[0]) { if (TextureImage[0]->data) { free(TextureImage[0]->data); } free(TextureImage[0]); } return Status; } void ReSizeGLScene(GLsizei width, GLsizei height) { if (height==0) { height=1; } glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Calculate The Aspect Ratio Of The Window gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int InitGL(void) { if (!LoadGLTextures()) { return FALSE; } glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearDepth(1.0f); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); return TRUE; } void DrawGLScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindTexture(GL_TEXTURE_2D, texture[0]); glLoadIdentity(); glTranslatef(-8.0f,0.0f,-30.0f); float y=sin(PI/180.0f*quar)*4.0f; float x=quar*16.0f/360.0f; glTranslatef(x,y,0.0f); glRotatef(quar,1.0f,1.0f,1.0f); glBegin(GL_QUADS); glColor4ub(rand()%256,rand()%256,rand()%256,255); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Back Face glColor4ub(rand()%256,rand()%256,rand()%256,255); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Top Face glColor4ub(rand()%256,rand()%256,rand()%256,255); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Bottom Face glColor4ub(rand()%256,rand()%256,rand()%256,255); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Right face glColor4ub(rand()%256,rand()%256,rand()%256,255); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Left Face glColor4ub(rand()%256,rand()%256,rand()%256,255); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glEnd(); glFlush(); } void rotate() { quar++; if(quar>720.0f) { quar=0.0f; } glutPostRedisplay(); } void keyboard(unsigned char key,int x,int y) { switch (key) { case 'S': glutIdleFunc(rotate); break; case 'R': glutIdleFunc(NULL); break; } } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(800,600); glutInitWindowPosition(100,100); glutCreateWindow("正玄移动"); InitGL(); glutDisplayFunc(DrawGLScene); glutKeyboardFunc(keyboard); glutReshapeFunc(ReSizeGLScene); glutMainLoop(); }
相关推荐
总的来说,"OpenGL茶壶模拟正弦曲线波动"是一个结合了计算机图形学、数学和编程技术的实践项目,旨在展示OpenGL的强大功能和灵活性,同时也提供了学习3D图形编程的好例子。通过研究和理解这个项目,开发者可以深化对...
本主题聚焦于如何使用OpenGL实现一个矩形动画,其中矩形会不断地移动,并在碰到边界时自动反弹,改变运动方向。 首先,我们需要了解OpenGL的基本概念。OpenGL是一个跨语言、跨平台的编程接口,它提供了大量用于绘制...
在这个"opengl.rar"压缩包中,我们可以看到一系列与OpenGL相关的知识,特别是关于圆柱面、旋转、曲面函数以及正弦函数曲面的实现。 首先,让我们深入了解一下圆柱面在OpenGL中的构建。在OpenGL中,创建几何形状通常...
在这个案例中,抖动被应用到图像的移动上,使得图片不是简单地平滑移动,而是按照正弦波的规律上下或左右摇摆,增加了视觉的动感和趣味性。 首先,理解正弦波的概念是至关重要的。正弦波是一种周期性连续函数,通常...
通过对这些文件的分析和学习,我们可以深入了解OpenGL水波模拟动画的实现细节,包括如何创建和更新纹理,如何编写高效的着色器,以及如何使用OpenGL特性来增强视觉效果。对于想要深入学习OpenGL图形编程或者游戏开发...
本资料包"OpenGL之利用矩阵的平移、旋转、综合变换等实现矩形的移动.zip"深入探讨了这些概念,并涉及到了移动过程中矩形的碰撞检测。 首先,让我们理解矩阵在OpenGL中的作用。矩阵是数学工具,可以用来表示和执行...
1. **顶点着色器**:OpenGL中的顶点着色器负责处理图形的顶点数据,可以用来移动或变形顶点,模拟水面的起伏。 2. **片段着色器**:在顶点着色器处理后的像素阶段,片段着色器可以计算每个像素的颜色,模拟水面的...
OpenGL ES(Open Graphics Library for Embedded Systems)是OpenGL的精简版本...通过研究这些资源,你可以深入学习如何在OpenGL ES环境中实现这两种纹理技术,并应用于自己的项目中,创建出更为丰富多样的3D图形效果。
OpenGL ES(OpenGL for Embedded Systems)是OpenGL的一个精简版本,专为嵌入式设备如智能手机、平板电脑等设计,用于2D和3D图形渲染。在"opengles特效之飘扬的旗帜"这个主题中,我们将探讨如何利用OpenGL ES实现...
OpenGL ES 2.0 是移动设备和嵌入式系统中广泛使用的图形库,用于渲染2D和3D图像。在“opengles2.0 Animation”这个主题中,我们将深入探讨如何利用OpenGL ES 2.0实现动画效果,特别是方波图的绘制以及模拟加速和减速...
7. 根据正弦曲线求出各点的深度,这个方法并不难写,但是在实现的时候,由于把顶点的顺序计算的有一点问题,画出来的图形在移动时不是按照正弦曲线的规律,使得波动的规律看起来极不自然,后来把顶点的计算改正后,...
OpenGL ES 是一种嵌入式图形库,用于在嵌入式设备上进行2D和3D图形渲染。在OpenGL ES中,没有内置的函数可以直接绘制出平面的圆形,因此需要通过编程方式实现。本文将深入探讨如何在OpenGL ES中实现平面圆的绘制以及...
总的来说,这个OpenGL小例子提供了一个实践性的学习平台,涵盖了OpenGL的基本用法、用户界面集成、游戏编程概念以及如何通过源码学习实际编程技巧。对于想要进入3D图形编程领域的开发者来说,这是一个非常有价值的...
在正弦和余弦函数中,改变相位会使得波形沿x轴移动。当相位为0时,正弦和余弦曲线分别从原点开始。增加相位会使曲线向右移动,减少相位则向左移动。 5. **图形用户界面(GUI)**:在这个程序中,用户通过对话框与之...
OpenGL是一种强大的图形编程接口,广泛应用于游戏开发、科学可视化、工程设计等领域。...通过分析和学习这些案例,我们可以深入理解OpenGL的工作原理,以及如何有效地利用它来创建高性能的图形应用程序。
OpenGL是计算机图形学中的一个强大库,用于在各种操作系统上创建和操纵2D和3D图形。Visual Studio是一个广泛使用的集成开发环境(IDE),支持多种编程语言,包括C++,这是编写OpenGL应用的常用语言。"Moving Waves...
5. **绘制曲线**:在OnDraw函数中,使用MoveTo移动画笔到(0, 0)(假设这是x轴和y轴的交叉点),然后通过一系列LineTo函数将点连接起来,形成曲线。每个点的坐标是计算得到的(x, sin(x))。 6. **刷新和响应**:确保...
在Android平台上,OpenGL ES是一个广泛使用的图形库,用于在移动设备上实现高性能的3D图形渲染。本篇将深入探讨如何使用OpenGL ES绘制一个球体。球体在计算机图形学中是一个基本的几何形状,通常通过一系列三角形来...
在Android平台上开发一个示波器小程序,可以展示正弦和余弦信号,是将嵌入式计算和可视化技术应用于移动设备的一个典型实例。这个小程序利用Android系统的强大功能,为用户提供实时信号显示,使得用户能够在手机或...
【描述】:“无限”暗示了该项目可能涉及到无限循环或者无限滚动的正弦波图案,同时提到了“学分”,这可能意味着它是一个学习项目,鼓励用户参与并提供贡献。提到的“找我 @”,可能是指作者提供了联系方式,以便...