一段绘制水面的源代码,谁能帮忙指点一下其中的数学知识

weekease 2003-10-15 10:31:19
procedure DrawWater;
var I, J : Integer;
VectLength : glFloat;
begin
// Calculate new velocity
For I :=2 to GridSize-2 do
For J :=2 to GridSize-2 do
Velocity[I, J] := Velocity[I, J] + (Position[I, J] -
(4*(Position[I-1,J] + Position[I+1,J] + Position[I,J-1] + Position[I,J+1]) + // left, right, above, below
Position[I-1,J-1] + Position[I+1,J-1] + Position[I-1,J+1] + Position[I+1,J+1])/25) / 7; // diagonally across

// Calculate the new ripple positions
For I:=2 to GridSize-2 do
For J:=2 to GridSize-2 do
Begin
Position[I, J] := Position[I, J] - Velocity[I,J];
Velocity[I, J] := Velocity[I, J] * Viscosity;
End;

// Calculate the new vertex coordinates
For I :=0 to GridSize do
For J :=0 to GridSize do
begin
Vertex[I, J].X :=(I - GridSize/2)/GridSize*5;
Vertex[I, J].Y :=(Position[I, J] / 1024)/GridSize*3;
Vertex[I, J].Z :=(J - GridSize/2)/GridSize*5;
end;

// Calculate the new vertex normals.
// Do this by using the points to each side to get the right angle
For I :=0 to GridSize do
begin
For J :=0 to GridSize do
begin
If (I > 0) and (J > 0) and (I < GridSize) and (J < GridSize) then
begin
with Normals[I, J] do
begin
X := Position[I+1, J] - Position[I-1,J];
Y := -2048;
Z := Position[I, J+1] - Position[I, J-1];

VectLength :=sqrt(x*x + y*y + z*z);
if VectLength <> 0 then
begin
X :=X/VectLength;
Y :=Y/VectLength;
Z :=Z/VectLength;
end;
end;
end
else
begin
Normals[I, J].X :=0;
Normals[I, J].Y :=1;
Normals[I, J].Z :=0;
end;
end;
end;

// Draw the water texture
glBindTexture(GL_TEXTURE_2D, WaterTexture);
For J :=0 to GridSize-1 do
begin
glBegin(GL_QUAD_STRIP);
for I :=0 to GridSize do
begin
glNormal3fv(@Normals[I, J+1]);
// glTexCoord2f(I/GridSize, (J+1)/GridSize);
glVertex3fv(@Vertex[I, J+1]);
glNormal3fv(@Normals[I, J]);
// glTexCoord2f(I/GridSize, J/GridSize);
glVertex3fv(@Vertex[I, J]);
end;
glEnd;
end;
end;
...全文
94 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttmmdd 2003-10-17
  • 打赏
  • 举报
回复
http://www.phy.uct.ac.za/courses/phy400w/cp/lectures.pdf
http://www.cs.rpi.edu/~trink/Papers/STicra.pdf
中有提到.
ttmmdd 2003-10-16
  • 打赏
  • 举报
回复
为什么我刚钢的回答没加上!?!?
好,AGAIN!
第一步,他通过周围的点和当前点的高度差计算出力和加速度并加在速度上,然后再将位置加上速度.也就是物理仿真中使用的欧拉法.
计算NORMAL的方法你画图就知道了.
weekease 2003-10-16
  • 打赏
  • 举报
回复
什么是欧拉法阿?

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧