⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ocean.cpp

📁 基于FFT的海面模拟。能够实现海面的复制
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -