BoatWave.cpp
上传用户:henghua
上传日期:2007-11-14
资源大小:7655k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #include "BoatWave.h"
  2. CBoatWave::CBoatWave(void)
  3. {
  4. }
  5. CBoatWave::~CBoatWave(void)
  6. {
  7. }
  8. // 初始化构造函数,获取参数具体值,尤其是8个角点的空间坐标值
  9. CBoatWave::CBoatWave(float boatx, float boatz){
  10. width = w_size;
  11. height = h_size;
  12. actualw = float(act_w_size);
  13. actualh = float(act_h_size);
  14. centersz = float(center_size);
  15. corner00 = D3DXVECTOR2(boatx - actualw/2, boatz - actualh/2);
  16. corner01 = D3DXVECTOR2(boatx + actualw/2, boatz - actualh/2);
  17. corner10 = D3DXVECTOR2(boatx - actualw/2, boatz + actualh/2);
  18. corner11 = D3DXVECTOR2(boatx + actualw/2, boatz + actualh/2);
  19. center00 = D3DXVECTOR2(boatx - centersz/2, boatz - centersz/2);
  20. center01 = D3DXVECTOR2(boatx + centersz/2, boatz - centersz/2);
  21. center10 = D3DXVECTOR2(boatx - centersz/2, boatz + centersz/2);
  22. center11 = D3DXVECTOR2(boatx + centersz/2, boatz + centersz/2);
  23. int i,j,t;
  24. for(t=0; t<3; t++)
  25. for(i=0; i<width; i++)
  26. for(j=0; j<height; j++)
  27. {
  28. waveHeight[t][i][j]=0;
  29. }
  30. pre0 = 0;
  31. pre1 = 1;
  32. cur = 2;
  33. c = 8;
  34. A = 0.8;
  35. e = 0.96;
  36. }
  37. // 在(posx,posz)处对水面产生激励
  38. void CBoatWave::Stimulate(float posx, float posz, float v)
  39. {
  40. int i, j;
  41. float px =posx ;
  42. float pz = posz ;
  43. FloatToInt(px, pz, i, j);
  44. float temp= (5.0f + ((FLOAT)rand()/(FLOAT)RAND_MAX ) ) * v /5;  // 激励的强弱取决于船的行进速度
  45. for(int u=-3;u<=3;u++)
  46. for(int v=-3;v<=3;v++)
  47. waveHeight[cur][i+u][j+v] = temp;
  48. }
  49. // 根据二维波的偏微分方程模拟水面波的运动
  50. void CBoatWave::MakeWave()
  51. {
  52. int temp;
  53. temp = cur, cur = pre0, pre0 = pre1, pre1 =temp;
  54. float h11, h01, h21, h10, h12;
  55. float acc;
  56. int i,j;
  57. for(i=0; i<width; i++)
  58. for(j=0; j<height; j++)
  59. {
  60. if(i-1 < 0)
  61. h01 = 0;
  62. else
  63. h01 = waveHeight[pre1][i-1][j];
  64. if(i+1 >= width)
  65. h21 = 0;
  66. else
  67. h21 = waveHeight[pre1][i+1][j];
  68. if(j-1 < 0)
  69. h10 = 0;
  70. else
  71. h10 = waveHeight[pre1][i][j-1];
  72. if(j+1 >= height)
  73. h12 = 0;
  74. else
  75. h12 = waveHeight[pre1][i][j+1];
  76. h11 = waveHeight[pre1][i][j];
  77. acc = c * (h01 + h21 + h10 + h12 - 4 * h11);
  78. waveHeight[cur][i][j] = (1+e) * h11 - e * waveHeight[pre0][i][j] + 0.5 * acc * dt * dt;
  79. }
  80. }
  81. // 由Float型转换为int型,以方便数组采样
  82. void CBoatWave::FloatToInt(float &fx, float &fy, int &ix, int &iy)
  83. {
  84. ix = int( (fx-corner00.x)/actualw * width ) & (width-1);
  85. iy = int( (fy-corner00.y)/actualh * height ) & (height-1);
  86. }
  87. // 整体平移函数:根据船的位置更新corner00,01,10,11和center00,01,10,11以及waveHeight[][][],使船始终处于尾迹场的中心区域内
  88. void CBoatWave::GridTranslate(float boatx, float boatz)
  89. {
  90. int i,j,k;
  91. int dd = w_size/4;
  92. float tt = (float)center_size/2.0;
  93. if(boatx > center11.x)
  94. {
  95. for(i=0; i<width; i++)
  96. for(j=0; j<height; j++)
  97. {
  98. if(i+dd<width)
  99. {
  100. waveHeight[0][i][j]=waveHeight[0][i+dd][j];
  101. waveHeight[1][i][j]=waveHeight[1][i+dd][j];
  102. waveHeight[2][i][j]=waveHeight[2][i+dd][j];
  103. }
  104. else
  105. {
  106. waveHeight[0][i][j]=0;
  107. waveHeight[1][i][j]=0;
  108. waveHeight[2][i][j]=0;
  109. }
  110. }
  111. corner00.x += tt, corner01.x += tt, corner10.x += tt, corner11.x += tt;
  112. center00.x += tt, center01.x += tt, center10.x += tt, center11.x += tt;
  113. }
  114. else
  115. {
  116. if(boatx < center00.x)
  117. {
  118. for(i=width-1; i>=0; i--)
  119. for(j=0; j<height; j++)
  120. {
  121. if(i-dd>=0)
  122. {
  123. waveHeight[0][i][j]=waveHeight[0][i-dd][j];
  124. waveHeight[1][i][j]=waveHeight[1][i-dd][j];
  125. waveHeight[2][i][j]=waveHeight[2][i-dd][j];
  126. }
  127. else
  128. {
  129. waveHeight[0][i][j]=0;
  130. waveHeight[1][i][j]=0;
  131. waveHeight[2][i][j]=0;
  132. }
  133. }
  134. corner00.x -= tt, corner01.x -= tt, corner10.x -= tt, corner11.x -= tt;
  135. center00.x -= tt, center01.x -= tt, center10.x -= tt, center11.x -= tt; 
  136. }
  137. else
  138. {
  139. if(boatz > center11.y)
  140. {
  141. for(i=0; i<width; i++)
  142. for(j=0; j<height; j++)
  143. {
  144. if(j+dd<width)
  145. {
  146. waveHeight[0][i][j]=waveHeight[0][i][j+dd];
  147. waveHeight[1][i][j]=waveHeight[1][i][j+dd];
  148. waveHeight[2][i][j]=waveHeight[2][i][j+dd];
  149. }
  150. else
  151. {
  152. waveHeight[0][i][j]=0;
  153. waveHeight[1][i][j]=0;
  154. waveHeight[2][i][j]=0;
  155. }
  156. }
  157. corner00.y += tt, corner01.y += tt, corner10.y += tt, corner11.y += tt;
  158. center00.y += tt, center01.y += tt, center10.y += tt, center11.y += tt;
  159. }
  160. else
  161. {
  162. if(boatz < center00.y)
  163. {
  164. for(i=0; i<width; i++)
  165. for(j=height-1; j>=0; j--)
  166. {
  167. if(j-dd>=0)
  168. {
  169. waveHeight[0][i][j]=waveHeight[0][i][j-dd];
  170. waveHeight[1][i][j]=waveHeight[1][i][j-dd];
  171. waveHeight[2][i][j]=waveHeight[2][i][j-dd];
  172. }
  173. else
  174. {
  175. waveHeight[0][i][j]=0;
  176. waveHeight[1][i][j]=0;
  177. waveHeight[2][i][j]=0;
  178. }
  179. }
  180. corner00.y -= tt, corner01.y -= tt, corner10.y -= tt, corner11.y -= tt;
  181. center00.y -= tt, center01.y -= tt, center10.y -= tt, center11.y -= tt;
  182. }
  183. }
  184. }
  185. }
  186. }
  187. // 获取高度
  188. float CBoatWave::GetHeight(float x, float y)
  189. {
  190. int ix,iy;
  191. this->FloatToInt(x, y, ix, iy);
  192. if(ix<0 || ix>=width || iy<0 || iy>=height)
  193. return 0.0f;
  194. else
  195. return waveHeight[cur][ix][iy];
  196. }
  197. // 调用此函数每桢更新尾迹场的数据
  198. void CBoatWave::Update(float x, float z, float v)
  199. {
  200. Stimulate(x, z, v);
  201. MakeWave();
  202. GridTranslate(x, z);
  203. }