Автор: Пользователь скрыл имя, 12 Декабря 2011 в 11:48, курсовая работа
Моделирование водных поверхностей является сложной, но интересной задачей. Здесь можно выделить такие подзадачи, как моделирование небольших водоемов (с видимыми границами), для которых характерны небольшие изменения поверхности, то есть небольшие колебания, а также интерференция колебаний от нескольких всплесков и отраженных колебаний от границ; большие водные поверхности: здесь рассматривают небольшие поверхностные колебания (как правило, в этом случае можно обойтись изменениями лишь текстуры или нескольких текстур поверхности (Bump Mapping и др., см. далее) не деформируя непосредственно саму поверхность), небольшие колебания: в этом случае поверхность разбивается на треугольники, но достаточно большого размера и над поверхностью производят небольшие колебания, которые соответствуют, например, небольшим волнам, большие колебания: этот большие волны, брызги и др., здесь происходят значительные деформации водных поверхностей, которые достаточно сложно физически описываются, поэтому большие волны практически никогда не визуализируются.
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:
constructor CreateWithPrepDiv2(FileName:
constructor CreateWithPrepDiv2_Inv(
destructor Destroy; override;
procedure PrepareImage(FileName:String);
procedure PrepareImageDiv2(FileName:
procedure PrepareImageDiv2_Inv(FileName:
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(
begin
Create;
PrepareImage(FileName);
end;
constructor TGLTexture.CreateWithPrepDiv2(
begin
Create;
PrepareImageDiv2(FileName);
end;
constructor TGLTexture.CreateWithPrepDiv2_
begin
Create;
PrepareImageDiv2_Inv(FileName)
end;
destructor TGLTexture.Destroy;
begin
if Assigned(FData)
then FreeMem(Data);
end;
procedure TGLTexture.PrepareImage(
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(
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(
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(
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.
G:=GetRValue(Bitmap.Canvas.
B:=GetRValue(Bitmap.Canvas.
Bitmap.Canvas.Pixels[j,i]:=
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_
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(
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.
G:=(255-GetRValue(Bitmap.
B:=(255-GetRValue(Bitmap.
Bitmap.Canvas.Pixels[j,i]:=
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;