Автор: Пользователь скрыл имя, 12 Декабря 2011 в 11:48, курсовая работа
Моделирование водных поверхностей является сложной, но интересной задачей. Здесь можно выделить такие подзадачи, как моделирование небольших водоемов (с видимыми границами), для которых характерны небольшие изменения поверхности, то есть небольшие колебания, а также интерференция колебаний от нескольких всплесков и отраженных колебаний от границ; большие водные поверхности: здесь рассматривают небольшие поверхностные колебания (как правило, в этом случае можно обойтись изменениями лишь текстуры или нескольких текстур поверхности (Bump Mapping и др., см. далее) не деформируя непосредственно саму поверхность), небольшие колебания: в этом случае поверхность разбивается на треугольники, но достаточно большого размера и над поверхностью производят небольшие колебания, которые соответствуют, например, небольшим волнам, большие колебания: этот большие волны, брызги и др., здесь происходят значительные деформации водных поверхностей, которые достаточно сложно физически описываются, поэтому большие волны практически никогда не визуализируются.
glVertex(-Width, 0, -Depth);
glTexCoord(1,0);
glVertex(-Width, 0, Depth);
glTexCoord(1,1);
glVertex(-Width, Height, Depth);
glTexCoord(0,1);
glVertex(-Width, Height, -Depth);
//Право
glTexCoord(0,0);
glVertex(Width, 0, Depth);
glTexCoord(1,0);
glVertex(Width, 0, -Depth);
glTexCoord(1,1);
glVertex(Width, Height, -Depth);
glTexCoord(0,1);
glVertex(Width, Height, Depth);
//Перед
glTexCoord(0,0);
glVertex( Width, 0, Depth);
glTexCoord(1,0);
glVertex(-Width, 0, Depth);
glTexCoord(1,1);
glVertex(-Width, Height, Depth);
glTexCoord(0,1);
glVertex( Width, Height, Depth);
//Зад
glTexCoord(0,0);
glVertex(-Width, 0, -Depth);
glTexCoord(1,0);
glVertex( Width, 0, -Depth);
glTexCoord(1,1);
glVertex( Width, Height, -Depth);
glTexCoord(0,1);
glVertex(-Width, Height, -Depth);
glEnd;
glPopMatrix;
end;
procedure DrawGround;
var
i,j:Byte;
Width:Double;
Height:Double;
begin
//Запомнем матрицу
glPushMatrix;
TexGround.ApplyTexture;
//Нарисуем треугольниками землю
glBegin(GL_TRIANGLES);
Width:=200;
Height:=200;
for i:=0 to GroundSegment-2 do
for j:=0 to GroundSegment-2 do
begin
glTexCoord(j/(GroundSegment-1)
glVertex3d((-0.5+j/(
glTexCoord(j/(GroundSegment-1)
glVertex3d((-0.5+j/(
glTexCoord((j+1)/(
glVertex3d((-0.5+(j+1)/(
//----------------------------
glTexCoord(j/(GroundSegment-1)
glVertex3d((-0.5+j/(
glTexCoord((j+1)/(
glVertex3d((-0.5+(j+1)/(
glTexCoord((j+1)/(
glVertex3d((-0.5+(j+1)/(
end;
glEnd;
glPopMatrix;
end;
procedure DrawCaust;
var
i,j:Byte;
Width:Double;
Height:Double;
begin
//Запомнем матрицу
glPushMatrix;
case CurCaust of
0:TexCaust1.ApplyTexture;
1:TexCaust2.ApplyTexture;
2:TexCaust3.ApplyTexture;
3:TexCaust4.ApplyTexture;
4:TexCaust5.ApplyTexture;
end;
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE_
//Нарисуем треугольниками землю
glBegin(GL_TRIANGLES);
Width:=200;
Height:=200;
for i:=0 to GroundSegment-2 do
for j:=0 to GroundSegment-2 do
begin
if (GroundMas[i,j]<-0.9)and(
then begin
glTexCoord(j/(GroundSegment-1)
glVertex3d((-0.5+j/(
glTexCoord(j/(GroundSegment-1)
glVertex3d((-0.5+j/(
glTexCoord((j+1)/(
glVertex3d((-0.5+(j+1)/(
end;
//----------------------------
if (GroundMas[i,j]<-0.9)and(
then begin
glTexCoord(j/(GroundSegment-1)
glVertex3d((-0.5+j/(
glTexCoord((j+1)/(
glVertex3d((-0.5+(j+1)/(
glTexCoord((j+1)/(
glVertex3d((-0.5+(j+1)/(
end;
end;
glEnd;
glDisable(GL_BLEND);
glPopMatrix;
end;
procedure DrawGroundBox;
begin
//Запомнем матрицу
glPushMatrix;
TexGround.ApplyTexture;
glBegin(GL_QUADS);
//Низ
glTexCoord(0,0);
glVertex(-100, -100, -100);
glTexCoord(1,0);
glVertex( 100, -100, -100);
glTexCoord(1,1);
glVertex( 100, -100, 100);
glTexCoord(0,1);
glVertex(-100, -100, 100);
glEnd;
//Лево
DrawBox(-100,-100,0,10,120,90)
//Право
DrawBox(100,-100,0,10,120,90);
//Перед
DrawBox(0,-100,100,110,120,10)
//Зад
DrawBox(0,-100,-100,110,120,
glEnd;
glPopMatrix;
end;
procedure DrawLight;
var
quadObj :GLUquadricObj;
begin
quadObj:=gluNewQuadric;
//Запомнем матрицу
glPushMatrix;
glDisable(GL_LIGHTING);
glColor3f(1,1,1);
glTranslatef(Light_pos[0],
gluSphere(quadObj,1,8,8);
gluDeleteQuadric(quadObj);
glEnable(GL_LIGHTING);
glPopMatrix;
end;
procedure TMainForm.CaustEditChange(
begin
CaustTimer.Interval:=round(
end;
procedure TMainForm.CaustTimerTimer(
begin
CurCaust:=(CurCaust+1) mod 5;
end;
procedure TMainForm.Draw;
begin
//Устанавливаем фоновый цвет
glClearColor(0.9, 0.9, 0.9, 1);
//Очистим буфер цвета и глубины
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
if ShowBoxCheckBox.Checked
then begin
if BoxLineCheckBox.Checked
then glPolygonMode(GL_FRONT_AND_
else glPolygonMode(GL_FRONT_AND_
DrawGroundBox;
end;
if ShowGroundCheckBox.Checked
then begin
if GroundLineCheckBox.Checked
then glPolygonMode(GL_FRONT_AND_
else glPolygonMode(GL_FRONT_AND_
DrawGround;
end;
if ShowCaustCheckBox.Checked
then begin
if CaustLineCheckBox.Checked
then glPolygonMode(GL_FRONT_AND_
else glPolygonMode(GL_FRONT_AND_
DrawCaust;
end;
if ShowWaterCheckBox.Checked
then begin
if WaterLineCheckBox.Checked
then glPolygonMode(GL_FRONT_AND_
else glPolygonMode(GL_FRONT_AND_
Water.DrawWithHits(Cam_X,Cam_
end;
if ShowLightCheckBox.Checked
then begin
if LightLineCheckBox.Checked
then glPolygonMode(GL_FRONT_AND_
else glPolygonMode(GL_FRONT_AND_
DrawLight;
end;
//Нужно
для прорисовки на окне
SwapBuffers(ghDC);
end;
end.
Вывод:
В ходе выполнения курсовой работы были реализованы следующие задачи:
С реализацией отражения в водной поверхности возникли проблемы, вследствие чего данный пункт задания реализован не был.
В целом же данная работа отвечает поставленным требованиям и корректно работает.