Code archives/3D Graphics - Misc/3D Water Waves
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This is the 3dwater i create for my project i create a mesh with hi-poly detail in center, and low-poly detail far of the center of the mesh like Terrain mesh, you see highdetail near of the camera the idea is you move the water with the camera pivot. media and .bb file http://www.mediafire.com/download/mce689kiyinukia/3DWaves_by_Santiago_Gonzalez.rar screenshot ![]() | |||||
Graphics3D 1024,768,0,2
Const eo# = .01 ;escala objetos
Const ee# = .01 ;escala escenarios
Global mx#,my#,mhl,mhc,mhr,mdc,mdl,mdr,mxs#,mys#,mzs#,mun$,accion$,mx1,my1,mzsv#,mlcv#,mrcv#,mouse_over$,last_mouse_over$,l_mdl
;! Create water 3d
Global mesh_agua = LoadMesh("objetos\agua\aguacurva3.b3d")
EntityPickMode mesh_agua,2
EntityFX mesh_agua,2
EntityShininess mesh_agua,.3
EntityColor mesh_agua,255,255,255
Global t_cube_map = LoadTexture("objetos\agua\cubemap2.jpg",64)
EntityTexture mesh_agua,t_cube_map,0,2
Global t_espuma = LoadAnimTexture("wateranim.bmp",256,124,124,0,25)
ScaleTexture t_espuma,.02,.02
TextureBlend t_espuma,3
Global t_e_frame
Global t_rio = LoadTexture("objetos\agua\waterhi2.jpg")
TextureBlend t_rio,2
te# = .06
ScaleTexture t_rio,te,te
;! Create camera
Global cam = CreateCamera()
PositionEntity cam,10,10,20
CameraClsColor cam,150,160,255
CameraFogColor cam,150,160,200
CameraFogMode cam,1
CameraFogRange cam,1,5000
CameraRange cam,1,100000
;! Create ambient sounds
;;SONIDOS!!!
;Global oido = CreatePivot(cam)
;CreateListener oido,.1,0,1
;Global ps_agua = CreatePivot(cam)
;Global s_agua = Load3DSound("sonidos\oleaje suave.mp3")
;LoopSound s_agua
;Global c_agua = EmitSound(s_agua,ps_agua)
;SoundVolume s_agua,.1
;ChannelPitch c_agua,22000
;ChannelVolume c_agua,.051
;! Create ships
Type barco
Field pivot
Field entidad
Field r#[3]
Field v#[3]
End Type
nombre$ = "puma26"
b.barco = New barco
b\pivot = CreatePivot()
b\entidad = CreateCube(b\pivot);LoadMesh("objetos\barcos\"+nombre$+"\"+nombre$+".b3d",b\pivot)
ScaleEntity b\entidad,4,4,8
UpdateNormals b\entidad
;! Create light
sol = CreateLight(1)
PositionEntity sol,200,100,0
PointEntity sol,b\pivot
crear_botones()
While Not KeyHit(1)
update_mouse()
If KeyDown(57) Then
WireFrame 1
Else
WireFrame 0
End If
wave_mesh()
PointEntity cam,mesh_agua
If mdr Then
FlushMouse
;MoveMouse -MouseXSpeed(),-MouseYSpeed()
FlushMouse
End If
If mdr Then
MoveEntity cam,mxs*.05,mys*-.05,mzs*5
MoveMouse 500,400
End If
PointEntity cam,mesh_agua
update_barcos()
UpdateWorld()
RenderWorld()
Color 255,255,255
Text 10,10, "3D Waves by Santiago Gonzalez. www.indiesoft.com.ar"
Text 10,30, "SPACE - Wireframe
Text 10,50, "MOUSE DOWN RIGHT : Mouse move camera"
Text 10,70, "Change the configuration of waves with the mouse"
Text 10,90, "Try Others .b3d water : aguacurva(1,2,3,4,5,6).b3d or aguarrecta(1 or 2).b3d"
Text 10,110, "i make diferents mesh to test results.
water_conf()
Flip
Wend
End
Function wave_mesh()
surf_agua = GetSurface (mesh_agua,1)
t_e_frame = (t_e_frame + 1) Mod 23
EntityTexture mesh_agua,t_espuma,t_e_frame,3
vert = CountVertices(surf_agua)
tri = CountTriangles(surf_agua)
fdx# = 5
fdy# = 1
fdz# = 11
wtipe = 0
alpha# = 1
f_alt# = 5
For b.boton = Each boton
If b\texto = "Vel" Then f_vel# = b\val
If b\texto = "Alt" Then f_alt# = b\val
If b\texto = "fdx" Then fdx# = b\val
If b\texto = "fdy" Then fdy# = b\val
If b\texto = "fdz" Then fdz# = b\val
If b\texto = "Wtype" Then wtipe = b\val
If b\texto = "Waves" Then waves = b\val
If b\texto = "Alpha" Then alpha# = b\val
Next
f_alt# = 3
For v = 0 To vert-1
If wtipe = 1 Then
z# = VertexZ(surf_agua,v)
y# = VertexY(surf_agua,v)
x# = VertexX(surf_agua,v)
For w = 1 To waves
dir = w * 30
y = y+Sin(dir+(z*waves*fdz+((x+waves)*fdy)+(MilliSecs()*f_vel)))* f_alt
x# = VertexX(surf_agua,v) + Cos((z*fdx)+MilliSecs()*f_vel)*.1
Next
y# = y# - (y *.6)
VertexCoords (surf_agua,v,x,y,z)
fy=100
;VertexColor surf_agua,v,100-(y*fy),100-(y*fy),250,alpha
End If
If wtipe = 2 Then
z# = VertexZ(surf_agua,v)
y# = VertexY(surf_agua,v) + Sin((v*fdz)+(MilliSecs()*f_vel))*.01
x# = VertexX(surf_agua,v) + Cos((z*fdx)+MilliSecs()*f_vel)*.002
For w = 1 To waves
y# = Sin((z+x)*fdy+(dir+MilliSecs()*f_vel))*f_alt
dir = w * 30
Next
VertexCoords (surf_agua,v,x,y,z)
fy=100
VertexColor surf_agua,v,100-(y*fy),100-(y*fy),250,alpha
End If
Next
UpdateNormals mesh_agua
End Function
Type boton
Field nombre$
Field texto$
Field val#
Field max#
Field min#
Field tipo
Field cat
End Type
Function crear_botones()
new_boton ("","Direction",0,0,360,1,1)
new_boton ("","WZize",100,10,1000,1,1)
new_boton ("","Wtype",1,0,10,2,1)
new_boton ("","Waves",1,1,10,2,1)
new_boton ("","Vel",.1,0,10,1,1)
new_boton ("","Alt",1,0,10,1,1)
new_boton ("","fdx",5,0,100,1,1)
new_boton ("","fdy",1,0,100,1,1)
new_boton ("","fdz",11,0,100,1,1)
new_boton ("","",11,0,10,1,1)
new_boton ("","Alpha",1,0,1,1,1)
End Function
Function water_conf()
Color 255,255,255
y=115
For b.boton = Each boton
x=20
x2=200
y=y+20
If Abs(my-y) < 10 Then
Color 255,255,0
If b\tipo = 1 Then b\val = b\val + mzs*b\val*.1
If b\tipo = 2 Then b\val = Int(b\val + mzs)
Else
Color 0,0,0
End If
If b\val > b\max Then b\val = b\max
If b\val < b\min Then b\val = b\min
Text x,y,b\texto
Text x2,y,b\val
Next
End Function
Function new_boton(nombre$,texto$,val#,min#,max#,tipo,cat)
b.boton = New boton
b\nombre$ = nombre$
b\texto$ = texto$
b\val# = val#
b\min# = min#
b\max# = max#
b\tipo = tipo
b\cat = cat
End Function
Function update_mouse()
l_mdl = mdl
mhl = MouseHit(1) ;Or JoyHit(1,0)
mhr = MouseHit(2) ;Or JoyHit(2,0)
mhc = MouseHit(3) ;Or JoyHit(1,0)
mx# = MouseX()
my# = MouseY()
mz# = MouseZ()
mxs# = MouseXSpeed()
mys# = MouseYSpeed()
mzs# = MouseZSpeed()
mdl = MouseDown(1) ;Or JoyDown(1,0)
mdr = MouseDown(2) ;Or JoyDown(2,0)
mdc = MouseDown(3) ;Or KeyDown(56); Or JoyDown(3,0)
If mdl = 0 Then
mx1 = mx
my1 = my
End If
pick = CameraPick(cam,mx,my)
If mdr = 1 Or mdc = 1 Then
MoveMouse gancho*.5,galto*.5
End If
End Function
Function update_barcos()
For b.barco = Each barco
pick = LinePick( EntityX(b\pivot,1),100,EntityZ(b\pivot,1),0,-200,0,1)
nx# = PickedNX()
ny# = PickedNY()
nz# = PickedNZ()
y# = PickedY()
ys# = EntityY(b\pivot,1)
flotacion# = .0005
gravedad#= .0005
If y > ys Then
b\v[1] = b\v[1] + flotacion
Else
b\v[1] = b\v[1] - gravedad
End If
rv# = .999
rr# = .999
av# = 100
b\r[0] = b\r[0] + nx * av
b\r[1] = b\r[1] + ny * av
b\r[2] = b\r[2] + nz * av
For i = 0 To 2
b\v[i] = b\v[i] * rv
b\r[i] = b\v[i] * rr
Next
AlignToVector b\pivot,nx,ny,nz,2,.05
b\r[1] = .2
b\v[2] = .05
TurnEntity b\pivot,b\r[0],b\r[1],b\r[2]
TranslateEntity b\pivot,b\v[0],b\v[1],0
MoveEntity b\pivot,0,0,b\v[2]
PositionEntity b\pivot,EntityX(b\pivot,1),y,EntityZ(b\pivot,1)
Next
End Function |
Comments
| ||
| Really nice! |
| ||
| Really good stuff + not that slow actually! |
| ||
| you welcome! maibe someone can find the way to make vertex manipulation more faster. |
| ||
| that would be lovely! =) It would also be lovely if there was absolutely 0 texture on the water, & a reflection of objects / surroundings! =) Regards, ~GF |
| ||
| You can find a similar code in the cubemap demo |
Code Archives Forum
