Hey, i was wonder how to go about doing a rippling effect. For example, how do you know which vertexs to choose when your rippling. Is there a way to say, choose the nearest vertex to this point, or what? How would you'z go about doing it?
ripple effect
Blitz3D Forums/Blitz3D Programming/ripple effect I'd be interested to know if there's a shortcut for this too. I've been mapping each vertex beforehand which is real pain and means I have to do it everytime I use the effect.
Just knocked this up. It's a bit rough but may be of use?
Graphics3D 640,480
light=CreateLight()
camera=CreateCamera()
Global size=20
Global scale=8
Global grid = make_grid()
PositionEntity camera,0,100,-50
PointEntity camera,grid
ripple# = 0
While Not KeyDown(1)
ripple = (ripple + 5 ) Mod 360
s=GetSurface(grid,1)
For v=0 To CountVertices(s)-1
d#=Sqr(VertexX(s,v)*VertexX(s,v)+VertexZ(s,v)*VertexZ(s,v))
a#=(-d*10)+ripple
VertexCoords s,v,VertexX(s,v),scale*Sin(a),VertexZ(s,v)
Next
UpdateNormals grid
RenderWorld()
Flip
Wend
;============================================================================================
;GRID =======================================================================================
;============================================================================================
Function make_grid()
mesh=CreateMesh():s=CreateSurface(mesh)
For x=0 To size
For z=0 To size
v0=AddVertex(s,(x-size*.5)*scale,0,(z-size*.5)*scale)
c#=100+50*( ( x+z ) Mod 2 )
VertexColor s,v0,0,c*.5,c
Next
Next
For x=0 To size-1
For z=0 To size-1
v0=x+z*(size+1)
v1=v0+1
v2=v1+(size+1)
v3=v0+(size+1)
AddTriangle s,v0,v1,v2
AddTriangle s,v2,v3,v0
Next
Next
EntityFX mesh,2
Return mesh
End Function
Graphics3D 640,480
light=CreateLight()
camera=CreateCamera()
Global size=20
Global scale=8
Global grid = make_grid()
PositionEntity camera,0,100,-50
PointEntity camera,grid
ripple# = 0
While Not KeyDown(1)
ripple = (ripple + 5 ) Mod 360
s=GetSurface(grid,1)
For v=0 To CountVertices(s)-1
d#=Sqr(VertexX(s,v)*VertexX(s,v)+VertexZ(s,v)*VertexZ(s,v))
a#=(-d*10)+ripple
VertexCoords s,v,VertexX(s,v),scale*Sin(a),VertexZ(s,v)
Next
UpdateNormals grid
RenderWorld()
Flip
Wend
;============================================================================================
;GRID =======================================================================================
;============================================================================================
Function make_grid()
mesh=CreateMesh():s=CreateSurface(mesh)
For x=0 To size
For z=0 To size
v0=AddVertex(s,(x-size*.5)*scale,0,(z-size*.5)*scale)
c#=100+50*( ( x+z ) Mod 2 )
VertexColor s,v0,0,c*.5,c
Next
Next
For x=0 To size-1
For z=0 To size-1
v0=x+z*(size+1)
v1=v0+1
v2=v1+(size+1)
v3=v0+(size+1)
AddTriangle s,v0,v1,v2
AddTriangle s,v2,v3,v0
Next
Next
EntityFX mesh,2
Return mesh
End Function
:D !!! Very nice function!! Suppose it can't just import a mesh and use this. Is there a way to find the vertexs at a given point?
actually, that function should work for anything. the vertexx(),vertexy(),and vertez() give coords
interesting piece of code :) I'll need to study it some more. Thnak you !
Here's something I threw together real quick. It's a function for doing ripples. You give it mesh, frequency, wave size (height), phase, center point, and the normal of the wave, and it takes care of the rest of it for you. Look at the example to see how exactly it works. To make the wave actually "wave" you just increment the phase, 0 to 360. That doesn't work in the example, but it should get you started.
Graphics3D 800,600,32,2 SetBuffer BackBuffer() Camera=CreateCamera() PositionEntity Camera,0,2,-5 Light=CreateLight(2) AmbientLight 60,60,60 LightRange Light,8 LightColor Light,255,200,150 PositionEntity Light,2,4,0 Mesh=CreateQuad(40) EntityColor Mesh,0,60,180 EntityPickMode Mesh,2 EntityShininess Mesh,0.2 Type Point Field x#,y#,z# End Type Pt.Point=Null While Not KeyDown(1) Cls Count#=Count#+90 PointEntity Camera,Mesh If Pt.Point=Null If CameraPick(Camera,MouseX(),MouseY()) If MouseDown(1) Pt.Point=New Point ;Wave Center Pt\x#=PickedX() Pt\y#=PickedY() Pt\z#=PickedZ() Nm.Point=New Point ;Wave Normal Nm\y#=1 Ripple(Mesh,200,0.2,Count#,Pt,Nm) UpdateNormals Mesh EndIf EndIf EndIf UpdateWorld RenderWorld If OldTime < MilliSecs() OldTime=MilliSecs()+1000 Fps=FrameCount FrameCount=0 Else FrameCount=FrameCount+1 EndIf Text 16,16,Fps+" FPS" Flip Wend Function Ripple(Mesh,Freq#,Height#,Phase#,Ct.Point,Nm.Point) For Sf=1 To CountSurfaces(Mesh) Surf=GetSurface(Mesh,Sf) For Vert=0 To CountVertices(Surf)-1 Vx#=VertexX(Surf,Vert) Vy#=VertexY(Surf,Vert) Vz#=VertexZ(Surf,Vert) TFormPoint Vx#,Vy#,Vz#,Mesh,0 Vx#=TFormedX() Vy#=TFormedY() Vz#=TFormedZ() Dx#=Ct\x#-Vx# Dy#=Ct\y#-Vy# Dz#=Ct\z#-Vz# Dd#=Sqr((Dx#*Dx#)+(Dy#*Dy#)+(Dz#*Dz#)) Vx#=Vx#+(Sin(-Phase#+(Dd#*Freq#))*Height#)*Nm\x# Vy#=Vy#+(Cos(-Phase#+(Dd#*Freq#))*Height#)*Nm\y# Vz#=Vz#+(Sin(-Phase#+(Dd#*Freq#))*Height#)*Nm\z# TFormPoint Vx#,Vy#,Vz#,0,Mesh Vx#=TFormedX() Vy#=TFormedY() Vz#=TFormedZ() VertexCoords(Surf,Vert,Vx#,Vy#,Vz#) Next Next End Function Function CreateQuad(msDt#,msParent=0) Mesh=CreateMesh(msParent) Surf=CreateSurface(Mesh) For x#=0 To msDt# For y#=0 To msDt# x2#=x#-(msDt#/2) y2#=y#-(msDt#/2) v0=AddVertex(Surf,x2#/msDt#,0,y2#/msDt#,(x#)/msDt#,(msDt#-y#)/msDt#) v1=AddVertex(Surf,(x2#+1)/msDt#,0,y2#/msDt#,(x#)/msDt#,(msDt#-y#)/msDt#) v2=AddVertex(Surf,x2#/msDt#,0,(y2#+1)/msDt#,(x#)/msDt#,(msDt#-y#)/msDt#) v3=AddVertex(Surf,(x2#+1)/msDt#,0,(y2#+1)/msDt#,(x#)/msDt#,(msDt#-y#)/msDt#) AddTriangle(Surf,v2,v1,v0) AddTriangle(Surf,v2,v3,v1) Next Next ScaleMesh Mesh,4,4,4 UpdateNormals Mesh Return Mesh End Function
Hey Todd, thanks :)
I got this for my wave to repeat, but it seems wrong somehow.
But Stevies code was more of what i wanted. I'm looking for a ripple to start from the centre and work it's way out. Once the ripple has passed, every thing before it returns to normal. Think the matrix when the helicopter crashes into the building. Thank you both, i'll look more into it :D
I got this for my wave to repeat, but it seems wrong somehow.
Graphics3D 800,600,32,2 SetBuffer BackBuffer() Camera=CreateCamera() PositionEntity Camera,0,2,-5 Light=CreateLight(2) AmbientLight 60,60,60 LightRange Light,8 LightColor Light,255,200,150 PositionEntity Light,2,4,0 Mesh=CreateQuad(40) EntityColor Mesh,0,60,180 EntityPickMode Mesh,2 EntityShininess Mesh,0.2 Type Point Field x#,y#,z# End Type Pt.Point=Null Global Count# Global loop;= 90 While Not KeyDown(1) Cls Count#=Count#+1 PointEntity Camera,Mesh If Pt.Point=Null If CameraPick(Camera,MouseX(),MouseY()) If MouseDown(1) Pt.Point=New Point ;Wave Center Pt\x#=PickedX() Pt\y#=PickedY() Pt\z#=PickedZ() Nm.Point=New Point ;Wave Normal Nm\y#=1 Ripple(Mesh,200,0.2,Count#,Pt,Nm) UpdateNormals Mesh ct=1 EndIf EndIf EndIf If ct=1 Then loop=loop+1:If loop>359 Then loop=0;ct=0 FreeEntity Mesh Mesh=CreateQuad(20) EntityColor Mesh,0,60,180 EntityPickMode Mesh,2 EntityShininess Mesh,0.2 ripple(Mesh,200,Sin(loop),Count*4,Pt,Nm) UpdateNormals Mesh End If UpdateWorld RenderWorld If OldTime < MilliSecs() OldTime=MilliSecs()+1000 Fps=FrameCount FrameCount=0 Else FrameCount=FrameCount+1 EndIf Text 16,16,Fps+" FPS" If ct=1 Then Text 0,0,"pt\x="+pt\x+" py="+pt\y+" pz="+pt\z Delay 1 Flip Wend Function Ripple(Mesh,Freq#,Height#,Phase#,Ct.Point,Nm.Point) For Sf=1 To CountSurfaces(Mesh) Surf=GetSurface(Mesh,Sf) For Vert=0 To CountVertices(Surf)-1 Vx#=VertexX(Surf,Vert) Vy#=VertexY(Surf,Vert) Vz#=VertexZ(Surf,Vert) TFormPoint Vx#,Vy#,Vz#,Mesh,0 Vx#=TFormedX() Vy#=TFormedY() Vz#=TFormedZ() Dx#=Ct\x#-Vx# Dy#=Ct\y#-Vy# Dz#=Ct\z#-Vz# Dd#=Sqr((Dx#*Dx#)+(Dy#*Dy#)+(Dz#*Dz#)) Vx#=Vx#+(Sin(-Phase#+(Dd#*Freq#))*Height#)*Nm\x# Vy#=Vy#+(Cos(-Phase#+(Dd#*Freq#))*Height#)*Nm\y# Vz#=Vz#+(Sin(-Phase#+(Dd#*Freq#))*Height#)*Nm\z# TFormPoint Vx#,Vy#,Vz#,0,Mesh Vx#=TFormedX() Vy#=TFormedY() Vz#=TFormedZ() VertexCoords(Surf,Vert,Vx#,Vy#,Vz#) Next Next End Function Function CreateQuad(msDt#,msParent=0) Mesh=CreateMesh(msParent) Surf=CreateSurface(Mesh) For x#=0 To msDt# For y#=0 To msDt# x2#=x#-(msDt#/2) y2#=y#-(msDt#/2) v0=AddVertex(Surf,x2#/msDt#,0,y2#/msDt#,(x#)/msDt#,(msDt#-y#)/msDt#) v1=AddVertex(Surf,(x2#+1)/msDt#,0,y2#/msDt#,(x#)/msDt#,(msDt#-y#)/msDt#) v2=AddVertex(Surf,x2#/msDt#,0,(y2#+1)/msDt#,(x#)/msDt#,(msDt#-y#)/msDt#) v3=AddVertex(Surf,(x2#+1)/msDt#,0,(y2#+1)/msDt#,(x#)/msDt#,(msDt#-y#)/msDt#) AddTriangle(Surf,v2,v1,v0) AddTriangle(Surf,v2,v3,v1) Next Next ScaleMesh Mesh,4,4,4 UpdateNormals Mesh Return Mesh End Function
But Stevies code was more of what i wanted. I'm looking for a ripple to start from the centre and work it's way out. Once the ripple has passed, every thing before it returns to normal. Think the matrix when the helicopter crashes into the building. Thank you both, i'll look more into it :D