opengl 飘动设计

一、

在写风吹旗帜效果的时候,注意的是上一个点与下一个点的如Z坐标的关系,下一个点的Z坐标是上一个点的此时的Z坐标,其实就是按波的传递性来计算,Z坐标可以按任何曲线的函数来计算,如sin, cos,这只是最基本的思想,要做得真实,就看算法的了,但动态实现就是用坐标传递。

如把旗帜分成44行,44列,只计算Z坐标的传递,不考试X与Y,

那么,一共有45 * 45个点,每个点三个坐标值

const float PI = 3.1415;

const int row = 44;    //要分成的行数

const int column = 44;   // 要分成的列数

const float length = 9;  //旗帜的长度

const disx = length / (float)column;

const disy = length / (float)row;

float coord[row][column][3];

// 按行逐行计算坐标值

for (int i=0; i < row; i++) {

float y = i * disy - length / 2.0;

for (int j=0; j < column; j++) {

coord[i][j][0] = j * disx - length / 2.0; //是为了保证旗帜处于正中间

coord[i][j][1] = y;

coord[i][j][2] = sin((float)j / (float)colum * 2.0 * PI);

// 注意除法时要不要把两个数都是整数

}

}

传递Z坐标

for (int i=0; i < row; i++) {

float hold = coord[i][0][2]; //保存第一个点的Z坐标,最后一个点要使用

for (int j=0; j < column-1; j++) {

coord[i][j][2] = coord[i][j+1][2];

}

coord[i][column-1] = hold;

}

这是最简单的计算,每一列的Z坐标都相同,重复了最后一个点的Z坐标与第一个点的Z坐标,还可以把列点的Z坐标按照一定的曲线方程来计算,然后把它传递给下一个点,还有X与Z坐标也有可能会变化,这里都是最简单的形式。

二、

为了能使Z轴即能在垂直方向运动,又能在水平方向运动,则需要两个数组来保存水平方向和垂直方向的Z坐标值。然后Z坐标为这两个坐标值的合成:

const int row = 45;

const int column = 45;

const float width= 9.0f;

const float height = 9.0f;

float coord[row][column][3];  // Flag的坐标

float hzcoord[row][column];   // Flag的Z坐标水平分量

float vzcoord[column][row];   // Flag的Z坐标垂直分量

//计算Z坐标的水平分量

for (int i = 0; i < row; i++) {

for (int j = 0; j < column; j++) {

hzcoord[i][j] = sin((float)j / (float)column * 360 * 3.1415 / 180);

}

}

//计算Z坐标的垂直分量

for (int i = 0; i < column; i++) {

for (int j = 0; j < row; j++) {

vzcoord[i][j] = sin((float)j / (float)column * 360 * 3.1415 / 180);

}

}

float disx = width / column;

float disy = height /row;

//计算每个点的坐标

for (int i = 0; i < row; i++) {

for (int j = 0; j < column; j++) {

coord[i][j][0] = j * disx - width / 2.0;

coord[i][j][1] = i * disy - height / 2.0;

coord[i][j][2] = hzcoord[i][j] + vzoord[j][i];

}

}

上面已经完成初始化每个点的坐标,下面就到了动态的每一帧时Z坐标的传递了:

//水平坐标分量的传递

for (int i = 0; i < row; i++) {

float hold = hzcoord[i][0];

for (int j = 0; j < column - 1; j++) {

hzcoord[i][j] = hzcoord[i][j+1];

}

hzcoord[i][column-1] = hold;

}

//垂直坐标分量的传递

for (int i = 0; i < column; i++) {

float hold = vzcoord[i][0];

for (int j = 0; j < row - 1; j++) {

vzcoord[i][j] = vzcoord[i][j+1];

}

vzcoord[i][row-1] = hold;

}

//每一帧时要计算的每个点的坐标

for (int i = 0; i < row; i++) {

for (int j = 0; j < column; j++) {

//X与Y坐标我们不用去变换,因为只考虑了Z坐标的变化

//coord[i][j][0] = j * disx - width / 2.0;

//coord[i][j][1] = i * disy - height / 2.0;

coord[i][j][2] = hzcoord[i][j] + vzoord[j][i];

}

}

时间: 2024-10-23 16:24:24

opengl 飘动设计的相关文章

第11课 OpenGL 飘动的旗帜

飘动的旗帜: 这一课从第六课的代码开始,创建一个飘动的旗帜.我相信在这课结束的时候,你可以掌握纹理映射和混合操作. 大家好!对那些想知道我在这里作了些什么的朋友,您可以先按文章的末尾所列出的链接,下载我那毫无意义的演示(Demo)看看先!我是bosco,我将尽我所能教您来实现一个以正弦波方式运动的图象.这一课基于NeHe的教程第六课,当然您至少也应该学会了一至六课的知识.您需要下载源码压缩包,并将压缩包内带的data目录连其下的位图一起释放至您的代码目录下.或者使用您自己的位图,当然它的尺寸必须

OpenGL 第一篇 概览

------------------------------------------------------------------------------------------------------------------------ 从现在开始,认真学习OpenGL的相关知识,把读过的每一章都做记录,希望能坚持到最后. -------------------------------------------------------------------------------------

Modern OpenGL用Shader拾取VBO内单一图元的思路和实现

Modern OpenGL用Shader拾取VBO内单一图元的思路和实现 什么意思? 拾取 最简单的理解拾取的方式大概是到(http://www.yakergong.net/nehe/course/tutorial_32.html)玩一下NEHE的拾取游戏.用鼠标点击飞过屏幕的物体就会击中它,这就是拾取的意义. Legacy OpenGL VS Modern OpenGL Legacy OpenGL就是使用glTranslate.glRotate.glScale.gluLookAt.glPers

iOS实现图形编程可以使用三种API(UIKIT、Core Graphics、OpenGL ES及GLKit)

这些api包含的绘制操作都在一个图形环境中进行绘制.一个图形环境包含绘制参数和所有的绘制需要的设备特定信息,包括屏幕图形环境.offscreen 位图环境和PDF图形环境,用来在屏幕表面.一个位图或一个pdf文件中进行图形和图像绘制.在屏幕图形环境中进行的绘制限定于在一个UIView类或其子类的实例中绘制,并直接在屏幕显示,在offscreen位图或PDF图形环境中进行的绘制不直接在屏幕上显示. 一.UIKIT API UIKIT是一组Objective-C API,为线条图形.Quartz图像

比较DirectX和OpenGL的区别

OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库.OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL.IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL.OpenGL的英文全称是"Open Graphics Library",顾名思义,OpenGL便是"开放的图形程序接口".虽然DirectX在家用市场全面领先,但在专业高端绘图领域,Open

CSharpGL(22)实现顺序无关的半透明渲染(Order-Indepentdent-Transparency)

+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(22)实现顺序无关的半透明渲染(Order-Indepentdent-Transparency) 在 GL.Enable(GL_BLEND); 后渲染半透明物体时,由于顶点被渲染的顺序固定,渲染出来的结果往往很奇怪.红宝书里提到一个OIT(Order-Independent-Transparency)的渲染方法,很好的解决了这个问题.这个功能太有用了.于是我把这个方法加入CSharpGL中. +BIT祝威+悄悄在此留下版了个权的信息

计算机图形学名词解释

转自 http://blog.csdn.net/lwfcgz/article/details/39254743 3D三维(three dimension).客观世界中静止的物体都是三维的,在计算机图形学中常在一定的坐标系中用(x,y,z)坐标系列表示物体. 3D modeling3D建模.用三维坐标来描述物体的形状.在各种计算机图形应用领域中有不同的三维建模方法,用不同的算法来描述这些领域中的物体和对象. 3D transformation3D变换.在三维空间中把物体的三维坐标从一个位置变换至另

iOS 图形编程总结

本文转载至 http://www.cocoachina.com/ios/20141104/10124.html MetaliOS开发Sprite Kit图形编程 iOS实现图形编程可以使用三种API(UIKIT.Core Graphics.OpenGL ES及GLKit). 这些api包含的绘制操作都在一个图形环境中进行绘制.一个图形环境包含绘制参数和所有的绘制需要的设备特定信息,包括屏幕图形环境.offscreen 位图环境和PDF图形环境,用来在屏幕表面.一个位图或一个pdf文件中进行图形和

[ios]iOS 图形编程总结

转自:http://www.cocoachina.com/ios/20141104/10124.html iOS实现图形编程可以使用三种API(UIKIT.Core Graphics.OpenGL ES及GLKit). 这些api包含的绘制操作都在一个图形环境中进行绘制.一个图形环境包含绘制参数和所有的绘制需要的设备特定信息,包括屏幕图形环境.offscreen 位图环境和PDF图形环境,用来在屏幕表面.一个位图或一个pdf文件中进行图形和图像绘制.在屏幕图形环境中进行的绘制限定于在一个UIVi