📄 ocean.cpp
字号:
#include "Ocean.h"
T_Ocean::T_Ocean(int sizeX, int sizeY, float oceanGridSize,float windScaleX, float windScaleY, float lambda, float waveHeight)
{
this->oceanSizeX = sizeX;//海面网格大小
this->oceanSizeY = sizeY;
this->oceanGridSize = oceanGridSize;
this->oceanWindScaleX = windScaleX; //风力大小系数
this->oceanWindScaleY = windScaleY;
this->oceanLambda = lambda;//对流系数
this->oceanWaveHeight = waveHeight;//浪高系数
this->oceanTimeDiff = 0;//时间步长的初值
this->showParticle = false;
this->particleNum = 10;
for (int i =0;i<512;i++)
{
for (int j=0;j<512;j++)
{
oceanDeltaX[i][j].imag = 0.0f;
oceanDeltaX[i][j].real= 0.0f;
oceanDeltaY[i][j].real= 0.0f;
oceanDeltaY[i][j].imag= 0.0f;
oceanH0[i][j].real= 0.0f;
oceanH0[i][j].imag= 0.0f;
oceanC[i][j].real= 0.0f;
oceanC[i][j].imag= 0.0f;
}
}
for (int i =0;i<512;i++)
{
for (int j=0;j<512;j++)
{
for (int k=0;k<2;k++)
{
oceanDisplayXY[i][j][k] = 0.0f; // holds the actual x and y for display
}
}
}
for (int i =0;i<512;i++)
{
for (int j=0;j<512;j++)
{
for (int k=0;k<3;k++)
{
oceanGridPosition[i][j][k] = 0.0f; //海洋各网格点位置
oceanNormals[i][j][k] = 0.0f; //法线中间存储数组
oceanBigNormals[i][j][k] = 0.0f;
}
}
}
for (int i =0;i<512;i++)
{
for (int j=0;j<512;j++)
{
for (int k=0;k<4;k++)
{
oceanHoldHorizontal[i][j][k] = 0.0f;//保存初始化状态时的浪高度
}
}
}
for (int i =0;i<512;i++)
{
for (int j=0;j<512;j++)
{
for (int k=0;k<10;k++)
{
oceanParticle[i][j][k].particleAcc.x = 0.0f;//初始化粒子
oceanParticle[i][j][k].particleAcc.y = 0.0f;
oceanParticle[i][j][k].particleAcc.z = 0.0f;
oceanParticle[i][j][k].particlePosition.x = 0.0f;
oceanParticle[i][j][k].particlePosition.y = 0.0f;
oceanParticle[i][j][k].particlePosition.z = 0.0f;
oceanParticle[i][j][k].particleVelocity.x = 0.0f;
oceanParticle[i][j][k].particleVelocity.y = 0.0f;
oceanParticle[i][j][k].particleVelocity.z = 0.0f;
}
}
}
this->oceanInitial();
this->particleIntial();
}
T_Ocean::T_Ocean()
{
this->oceanSizeX = 128;//海面网格大小
this->oceanSizeY = 128;
this->oceanGridSize = 1.0f;
this->oceanWindScaleX = 0.1f; //风力大小系数
this->oceanWindScaleY = 0.1f;
this->oceanLambda = 0.28f;//对流系数
this->oceanWaveHeight = 0.075f;//浪高系数
this->oceanTimeDiff = 0;//时间步长的初值
this->showParticle = false;
this->particleNum = 10;
for (int i =0;i<512;i++)
{
for (int j=0;j<512;j++)
{
oceanDeltaX[i][j].imag = 0.0f;
oceanDeltaX[i][j].real= 0.0f;
oceanDeltaY[i][j].real= 0.0f;
oceanDeltaY[i][j].imag= 0.0f;
oceanH0[i][j].real= 0.0f;
oceanH0[i][j].imag= 0.0f;
oceanC[i][j].real= 0.0f;
oceanC[i][j].imag= 0.0f;
}
}
for (int i =0;i<512;i++)
{
for (int j=0;j<512;j++)
{
for (int k=0;k<2;k++)
{
oceanDisplayXY[i][j][k] = 0.0f; // holds the actual x and y for display
}
}
}
for (int i =0;i<512;i++)
{
for (int j=0;j<512;j++)
{
for (int k=0;k<3;k++)
{
oceanGridPosition[i][j][k] = 0.0f; //海洋各网格点位置
oceanNormals[i][j][k] = 0.0f; //法线中间存储数组
oceanBigNormals[i][j][k] = 0.0f;
}
}
}
for (int i =0;i<512;i++)
{
for (int j=0;j<512;j++)
{
for (int k=0;k<4;k++)
{
oceanHoldHorizontal[i][j][k] = 0.0f;//保存初始化状态时的浪高度
}
}
}
for (int i =0;i<512;i++)
{
for (int j=0;j<512;j++)
{
for (int k=0;k<10;k++)
{
oceanParticle[i][j][k].particleAcc.x = 0.0f;//初始化粒子
oceanParticle[i][j][k].particleAcc.y = 0.0f;
oceanParticle[i][j][k].particleAcc.z = 0.0f;
oceanParticle[i][j][k].particlePosition.x = 0.0f;
oceanParticle[i][j][k].particlePosition.y = 0.0f;
oceanParticle[i][j][k].particlePosition.z = 0.0f;
oceanParticle[i][j][k].particleVelocity.x = 0.0f;
oceanParticle[i][j][k].particleVelocity.y = 0.0f;
oceanParticle[i][j][k].particleVelocity.z = 0.0f;
}
}
}
this->oceanInitial();
this->particleIntial();
}
void T_Ocean::oceanInitial()
{
#define invSqrt2 (1.0f)/sqrt(2.0f)
double PI = 3.1415926835927f;
double aGlobal=0.001f;
double rootOfPhillips;
double horizontal[2];
double gaussValue[2];
double windGlobal[2];
windGlobal[0] = 100*this->oceanWindScaleX;//风力的大小和方向参数,300左右比较合适
windGlobal[1] = 100*this->oceanWindScaleY;
for (int i=0;i<this->oceanSizeX;i++)
{
for (int j=0;j<this->oceanSizeY;j++)
{
horizontal[0]=oceanHoldHorizontal[i][j][0]=2.0f*PI*((double)i-0.5f*(this->oceanSizeX))/((this->oceanSizeX)*2.0f);
horizontal[1]=oceanHoldHorizontal[i][j][1]=2.0f*PI*((double)j-0.5f*(this->oceanSizeY))/((this->oceanSizeY)*2.0f);
oceanHoldHorizontal[i][j][3]=oceanHoldHorizontal[i][j][0]*oceanHoldHorizontal[i][j][0]+oceanHoldHorizontal[i][j][1]*oceanHoldHorizontal[i][j][1];
oceanHoldHorizontal[i][j][2]=sqrt(oceanHoldHorizontal[i][j][3]);
ouGauss(gaussValue);
rootOfPhillips=sqrt(ouPhillips(aGlobal,horizontal,windGlobal));
oceanH0[i][j].real=invSqrt2*gaussValue[0]*rootOfPhillips;//求解出ho(K)
oceanH0[i][j].imag=invSqrt2*gaussValue[1]*rootOfPhillips;
}
}
}
void T_Ocean::oceanMakeNormals(oceanComplex c[512][512])
{
double xValue = 2;
double yValue = 2;
double ta[3];
double tb[3];
double tc[3];
for (int i=0;i<(this->oceanSizeX)-1;i++)
{
for (int j=0;j<(this->oceanSizeY)-1;j++)
{
ta[0]=xValue;
ta[1]=0.0;
ta[2]=(c[i+1][j].real-c[i][j].real)*(this->oceanWaveHeight);
tb[0]=0.0;
tb[1]=yValue;
tb[2]=(c[i][j+1].real-c[i][j].real)*(this->oceanWaveHeight);
ouCrossProd(ta,tb,tc);
this->oceanNormals[i][j][0]=tc[0];
this->oceanNormals[i][j][1]=tc[1];
this->oceanNormals[i][j][2]=tc[2];
}
}
for (int i=0;i<(this->oceanSizeX);i++)
{
this->oceanNormals[i][(this->oceanSizeX)-1][0]=this->oceanNormals[i][0][0];
this->oceanNormals[i][(this->oceanSizeX)-1][1]=this->oceanNormals[i][0][1];
this->oceanNormals[i][(this->oceanSizeX)-1][2]=this->oceanNormals[i][0][2];
this->oceanNormals[(this->oceanSizeX)-1][i][0]=this->oceanNormals[0][i][0];
this->oceanNormals[(this->oceanSizeX)-1][i][1]=this->oceanNormals[0][i][1];
this->oceanNormals[(this->oceanSizeX)-1][i][2]=this->oceanNormals[0][i][2];
}
}
void T_Ocean::oceanPrepLoop()
{
for (int i=0;i<this->oceanSizeX;i++)
{
for (int j=0;j<this->oceanSizeY;j++)
{
this->oceanGridPosition[i][j][0]=this->oceanDisplayXY[i][j][0]*0.5f*this->oceanGridSize;
this->oceanGridPosition[i][j][2]=this->oceanDisplayXY[i][j][1]*0.5f*this->oceanGridSize;
this->oceanGridPosition[i][j][1]=this->oceanC[i][j].real * this->oceanWaveHeight;
this->oceanBigNormals[i][j][0]=this->oceanNormals[i][j][0];
this->oceanBigNormals[i][j][1]=this->oceanNormals[i][j][1];
this->oceanBigNormals[i][j][2]=this->oceanNormals[i][j][2];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -