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

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

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

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

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

kurs.doc

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

  end;

end;

procedure TGrisSpinEdit.CMEnter(var Message: TCMGotFocus);

begin

     if AutoSelect and not (csLButtonDown in ControlState) then

       SelectAll;

     inherited;

     FBackUp:=Value;

end;

procedure TGrisSpinEdit.Change;

begin

     if (Text<>'')and(Text<>'-')

       then begin

                 inherited Change;

                 SetValue (Value);

                 FBackUp:=Value;

            end;

end;

procedure TGrisSpinEdit.SetMinValue (Value:Extended);

begin

     if FMinValue<>Value

       then begin

                 FMinValue:=Value;

                 if FMaxValue<FMinValue

                   then FMaxValue:=FMinValue;

                 if CheckValue (Value) <> Value

                   then SetValue (Value);

            end;

end;

procedure TGrisSpinEdit.SetMaxValue (Value:Extended);

begin

     if FMaxValue<>Value

       then begin

                 FMaxValue:=Value;

                 if FMaxValue<FMinValue

                   then FMinValue:=FMaxValue;

                 if CheckValue (Value) <> Value

                   then SetValue (Value);

           end;

end;

end. 

unit TextureUnit; 

interface

uses OpenGL, JPEG, SysUtils, Windows, Graphics;

type

  PPixelArray = ^TPixelArray;

  TPixelArray = array [0..0] of Byte;

  TGLTexture=class(TObject)

    private

           FWidth:Integer;

           FHeight:Integer;

           FData : PPixelArray;

    protected

    public

          constructor Create;

          constructor CreateWithPrep(FileName:String);

          constructor CreateWithPrepDiv2(FileName:String);

          constructor CreateWithPrepDiv2_Inv(FileName:String);

          destructor  Destroy; override; 

          procedure   PrepareImage(FileName:String);

          procedure   PrepareImageDiv2(FileName:String);

          procedure   PrepareImageDiv2_Inv(FileName:String);

          procedure   ApplyTexture;

          property    Width:Integer     read FWidth;

          property    Height:Integer    read FHeight;

          property    Data:PPixelArray  read FData;

  end;

implementation

constructor TGLTexture.Create;

begin

     FWidth:=0;

     FHeight:=0;

     FData:=nil;

end;

constructor TGLTexture.CreateWithPrep(FileName:String);

begin

     Create;

     PrepareImage(FileName);

end;

constructor TGLTexture.CreateWithPrepDiv2(FileName:String);

begin

     Create;

     PrepareImageDiv2(FileName);

end;

constructor TGLTexture.CreateWithPrepDiv2_Inv(FileName:String);

begin

     Create;

     PrepareImageDiv2_Inv(FileName);

end;

destructor  TGLTexture.Destroy;

begin

     if Assigned(FData)

       then FreeMem(Data);

end;

procedure TGLTexture.PrepareImage(FileName:String);

var

  Bitmap : TBitmap;

  JPG:TJPEGImage;

  BMInfo : TBitmapInfo;

  I, ImageSize : Integer;

  Temp : Byte;

  MemDC : HDC;

begin

  JPG:=TJPEGImage.Create;

  Bitmap := TBitmap.Create;

  //Чтение изображения

  if SameText(copy(FileName,Length(FileName)-3,4),'.bmp')

    then Bitmap.LoadFromFile (FileName)

    else begin

              JPG.LoadFromFile (FileName);

              Bitmap.Assign(JPG);

         end;

  //Получение текстуры

  with BMinfo.bmiHeader do begin

    FillChar (BMInfo, SizeOf(BMInfo), 0);

    biSize := sizeof (TBitmapInfoHeader);

    biBitCount := 24;

    biWidth := Bitmap.Width;

    biHeight := Bitmap.Height;

    FWidth := biWidth;

    FHeight := biHeight; 

    ImageSize := biWidth * biHeight;

    biPlanes := 1;

    biCompression := BI_RGB;

    MemDC := CreateCompatibleDC (0);

    if Assigned(FData)

       then FreeMem(Data);

    GetMem (FData, ImageSize * 3);

    try

      GetDIBits (MemDC, Bitmap.Handle, 0, biHeight, Data, BMInfo, DIB_RGB_COLORS);

      For I := 0 to ImageSize - 1 do begin

          Temp := Data [I * 3];

          Data [I * 3] := Data [I * 3 + 2];

          Data [I * 3 + 2] := Temp;

      end;

     finally

      DeleteDC (MemDC);

      Bitmap.Free;

      JPG.Free;

   end;

  end;

end;

procedure TGLTexture.PrepareImageDiv2(FileName:String);

var

  Bitmap : TBitmap;

  JPG:TJPEGImage;

  BMInfo : TBitmapInfo;

  I,j, ImageSize : Integer;

  Temp : Byte;

  MemDC : HDC;

  R,G,B:Byte;

begin

  JPG:=TJPEGImage.Create;

  Bitmap := TBitmap.Create;

  //Чтение изображения

  if SameText(copy(FileName,Length(FileName)-3,4),'.bmp')

    then Bitmap.LoadFromFile (FileName)

    else begin

              JPG.LoadFromFile (FileName);

              Bitmap.Assign(JPG);

         end;

  for i:=0 to Bitmap.Height-1 do

  for j:=0 to Bitmap.Width-1 do

  begin

       R:=GetRValue(Bitmap.Canvas.Pixels[j,i]) div 2;

       G:=GetRValue(Bitmap.Canvas.Pixels[j,i]) div 2;

       B:=GetRValue(Bitmap.Canvas.Pixels[j,i]) div 2;

       Bitmap.Canvas.Pixels[j,i]:=RGB(R,G,B);

  end;

  //Получение текстуры

  with BMinfo.bmiHeader do begin

    FillChar (BMInfo, SizeOf(BMInfo), 0);

    biSize := sizeof (TBitmapInfoHeader);

    biBitCount := 24;

    biWidth := Bitmap.Width;

    biHeight := Bitmap.Height;

    FWidth := biWidth;

    FHeight := biHeight;

    ImageSize := biWidth * biHeight;

    biPlanes := 1;

    biCompression := BI_RGB;

    MemDC := CreateCompatibleDC (0);

    if Assigned(FData)

       then FreeMem(Data); 

    GetMem (FData, ImageSize * 3);

    try

      GetDIBits (MemDC, Bitmap.Handle, 0, biHeight, Data, BMInfo, DIB_RGB_COLORS);

      For I := 0 to ImageSize - 1 do begin

          Temp := Data [I * 3];

          Data [I * 3] := Data [I * 3 + 2];

          Data [I * 3 + 2] := Temp;

      end;

     finally

      DeleteDC (MemDC);

      Bitmap.Free;

      JPG.Free;

   end;

  end;

end;

procedure TGLTexture.PrepareImageDiv2_Inv(FileName:String);

var

  Bitmap : TBitmap;

  JPG:TJPEGImage;

  BMInfo : TBitmapInfo;

  I,j, ImageSize : Integer;

  Temp : Byte;

  MemDC : HDC;

  R,G,B:Byte;

begin

  JPG:=TJPEGImage.Create;

  Bitmap := TBitmap.Create;

  //Чтение изображения

  if SameText(copy(FileName,Length(FileName)-3,4),'.bmp')

    then Bitmap.LoadFromFile (FileName)

    else begin

              JPG.LoadFromFile (FileName);

              Bitmap.Assign(JPG);

         end;

  for i:=0 to Bitmap.Height-1 do

  for j:=0 to Bitmap.Width-1 do

  begin

       R:=(255-GetRValue(Bitmap.Canvas.Pixels[j,i])) div 2;

       G:=(255-GetRValue(Bitmap.Canvas.Pixels[j,i])) div 2;

       B:=(255-GetRValue(Bitmap.Canvas.Pixels[j,i])) div 2;

       Bitmap.Canvas.Pixels[j,i]:=RGB(R,G,B);

  end;

  //Получение текстуры

  with BMinfo.bmiHeader do begin

    FillChar (BMInfo, SizeOf(BMInfo), 0);

    biSize := sizeof (TBitmapInfoHeader);

    biBitCount := 24;

    biWidth := Bitmap.Width;

    biHeight := Bitmap.Height;

    FWidth := biWidth;

    FHeight := biHeight;

    ImageSize := biWidth * biHeight;

    biPlanes := 1;

    biCompression := BI_RGB;

    MemDC := CreateCompatibleDC (0);

    if Assigned(FData)

       then FreeMem(Data);

    GetMem (FData, ImageSize * 3);

    try

      GetDIBits (MemDC, Bitmap.Handle, 0, biHeight, Data, BMInfo, DIB_RGB_COLORS);

      For I := 0 to ImageSize - 1 do begin

          Temp := Data [I * 3];

          Data [I * 3] := Data [I * 3 + 2];

          Data [I * 3 + 2] := Temp;

      end;

     finally

      DeleteDC (MemDC);

      Bitmap.Free;

      JPG.Free;

   end;

  end;

end;

procedure TGLTexture.ApplyTexture;

begin

     //Активировать текстуру

     glTexImage2d(GL_TEXTURE_2D, 0, 3, FWidth,  FHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, Data);

end;

end. 

unit WaterUnit; 

interface

uses

    OpenGL, Math, dialogs, sysutils,

    TextureUnit;

type

  TVector3D=record

                  X,Y,Z:Double;

            end;

  TNode=record

              F:TVector3D;

              F_ext:TVector3D;

              Coord:TVector3D;

              a:TVector3D;

              v:TVector3D;

        end;

  TNodes=array of array of TNode;

  THit=record

             Coord:TVector3D;

             v:TVector3D;

       end;

  THits=array of THit;

  TGLWater=class(TObject)

    private

           FNodes:TNodes;

           FSegments:Byte;

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