Визуализация воды

Автор: Пользователь скрыл имя, 12 Декабря 2011 в 11:48, курсовая работа

Описание работы

Моделирование водных поверхностей является сложной, но интересной задачей. Здесь можно выделить такие подзадачи, как моделирование небольших водоемов (с видимыми границами), для которых характерны небольшие изменения поверхности, то есть небольшие колебания, а также интерференция колебаний от нескольких всплесков и отраженных колебаний от границ; большие водные поверхности: здесь рассматривают небольшие поверхностные колебания (как правило, в этом случае можно обойтись изменениями лишь текстуры или нескольких текстур поверхности (Bump Mapping и др., см. далее) не деформируя непосредственно саму поверхность), небольшие колебания: в этом случае поверхность разбивается на треугольники, но достаточно большого размера и над поверхностью производят небольшие колебания, которые соответствуют, например, небольшим волнам, большие колебания: этот большие волны, брызги и др., здесь происходят значительные деформации водных поверхностей, которые достаточно сложно физически описываются, поэтому большие волны практически никогда не визуализируются.

Работа содержит 1 файл

kurs.doc

— 428.50 Кб (Скачать)

       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),i/(GroundSegment-1));

              glVertex3d((-0.5+j/(GroundSegment-1))*Width,     GroundMas[i,j],     (-0.5+i/(GroundSegment-1))*Height);

              glTexCoord(j/(GroundSegment-1),(i+1)/(GroundSegment-1));

              glVertex3d((-0.5+j/(GroundSegment-1))*Width,     GroundMas[i+1,j],   (-0.5+(i+1)/(GroundSegment-1))*Height);

              glTexCoord((j+1)/(GroundSegment-1),(i+1)/(GroundSegment-1));

              glVertex3d((-0.5+(j+1)/(GroundSegment-1))*Width, GroundMas[i+1,j+1], (-0.5+(i+1)/(GroundSegment-1))*Height);

              //----------------------------------------------------------------

              glTexCoord(j/(GroundSegment-1),i/(GroundSegment-1));

              glVertex3d((-0.5+j/(GroundSegment-1))*Width,     GroundMas[i,j],     (-0.5+i/(GroundSegment-1))*Height);

              glTexCoord((j+1)/(GroundSegment-1),i/(GroundSegment-1));

              glVertex3d((-0.5+(j+1)/(GroundSegment-1))*Width, GroundMas[i,j+1],   (-0.5+i/(GroundSegment-1))*Height);

              glTexCoord((j+1)/(GroundSegment-1),(i+1)/(GroundSegment-1));

              glVertex3d((-0.5+(j+1)/(GroundSegment-1))*Width, GroundMas[i+1,j+1], (-0.5+(i+1)/(GroundSegment-1))*Height);

         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_MINUS_SRC_COLOR);

     //Нарисуем треугольниками землю

       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(GroundMas[i+1,j]<-0.9)and(GroundMas[i+1,j+1]<-0.9)

                then begin

                          glTexCoord(j/(GroundSegment-1),i/(GroundSegment-1));

                          glVertex3d((-0.5+j/(GroundSegment-1))*Width,     GroundMas[i,j]+0.1,     (-0.5+i/(GroundSegment-1))*Height);

                          glTexCoord(j/(GroundSegment-1),(i+1)/(GroundSegment-1));

                          glVertex3d((-0.5+j/(GroundSegment-1))*Width,     GroundMas[i+1,j]+0.1,   (-0.5+(i+1)/(GroundSegment-1))*Height);

                          glTexCoord((j+1)/(GroundSegment-1),(i+1)/(GroundSegment-1));

                          glVertex3d((-0.5+(j+1)/(GroundSegment-1))*Width, GroundMas[i+1,j+1]+0.1, (-0.5+(i+1)/(GroundSegment-1))*Height);

                     end;

             //----------------------------------------------------------------

              if (GroundMas[i,j]<-0.9)and(GroundMas[i,j+1]<-0.9)and(GroundMas[i+1,j+1]<-0.9)

                then begin

                          glTexCoord(j/(GroundSegment-1),i/(GroundSegment-1));

                          glVertex3d((-0.5+j/(GroundSegment-1))*Width,     GroundMas[i,j]+0.1,     (-0.5+i/(GroundSegment-1))*Height);

                          glTexCoord((j+1)/(GroundSegment-1),i/(GroundSegment-1));

                          glVertex3d((-0.5+(j+1)/(GroundSegment-1))*Width, GroundMas[i,j+1]+0.1,   (-0.5+i/(GroundSegment-1))*Height);

                          glTexCoord((j+1)/(GroundSegment-1),(i+1)/(GroundSegment-1));

                          glVertex3d((-0.5+(j+1)/(GroundSegment-1))*Width, GroundMas[i+1,j+1]+0.1, (-0.5+(i+1)/(GroundSegment-1))*Height);

                    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,10);

       glEnd;

     glPopMatrix;

end;

procedure DrawLight;

var

   quadObj :GLUquadricObj;

begin

     quadObj:=gluNewQuadric;

     //Запомнем матрицу

     glPushMatrix;

     glDisable(GL_LIGHTING);

     glColor3f(1,1,1);

     glTranslatef(Light_pos[0],Light_pos[1],Light_pos[2]);

     gluSphere(quadObj,1,8,8);

     gluDeleteQuadric(quadObj);

     glEnable(GL_LIGHTING);

     glPopMatrix;

end;

procedure TMainForm.CaustEditChange(Sender: TObject);

begin

     CaustTimer.Interval:=round(CaustEdit.Value);

end;

procedure TMainForm.CaustTimerTimer(Sender: TObject);

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_BACK, GL_LINE)

                   else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

                         DrawGroundBox;

            end;

     if ShowGroundCheckBox.Checked

       then begin

                if GroundLineCheckBox.Checked

                   then glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)

                   else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

                 DrawGround;

            end;

     if ShowCaustCheckBox.Checked

       then begin

                 if CaustLineCheckBox.Checked

                   then glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)

                   else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

                 DrawCaust;

            end;      

     if ShowWaterCheckBox.Checked

       then begin

                 if WaterLineCheckBox.Checked

                   then glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)

                   else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

                 Water.DrawWithHits(Cam_X,Cam_Y,Cam_Z,Target_X-Cam_X,Target_Y-Cam_Y,Target_Z-Cam_Z);

            end;

     if ShowLightCheckBox.Checked

       then begin

                 if LightLineCheckBox.Checked

                   then glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)

                  else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

                 DrawLight;

            end;

     //Нужно  для прорисовки на окне приложения

     SwapBuffers(ghDC);

end;

end. 

 

Вывод:

   В ходе выполнения курсовой работы были реализованы следующие задачи:

  • Моделирование динамически изменяющейся водной поверхности;
  • Интерактивное управление изменениями поверхности (добавить всплеск и др.)
  • Реализация прозрачности и преломления в водной поверхности
  • Перемещение наблюдателя по сцене
  • Реализация каустиков и визуализация донных поверхностей
  • Использование bump mapping'а для более точной передачи водной поверхности

С реализацией  отражения в водной поверхности возникли проблемы, вследствие чего данный пункт задания реализован не был.

     В целом же данная работа отвечает поставленным требованиям и корректно работает.

Информация о работе Визуализация воды