Page Curl Effect...

Blitz3D Forums/Blitz3D Programming/Page Curl Effect...

Does anyone have any code for making a page curl effect that could be applied to simple segmented plane?

I need to have an open book where the pages turn one at a time.

Thanks in advance for any help :)

I would use an animated mesh which is simpler in my opinion.

I posted code a while back ... not exactly what you're looking for but is a start.

Graphics3D 640,480,16,1
Global CAMERA = CreateCamera()
CameraRange CAMERA,0.01,100
WireFrame 0

PositionEntity CAMERA, 0,0,-10 ;1.3

Const Radius# = 1.0

FLAT = MESHflat( Radius * Pi ,2,Radius , 16 ) : HideEntity FLAT
TUBE = MESHtube( Radius,2,Radius , 16 ) : HideEntity TUBE
Texture = LoadTexture("ScreenShot013.bmp")

VISIBLE = MESHflat( 1,1,1 , 16 )
EntityTexture VISIBLE, Texture
Dir# = 1.0 : TimeStep# = 0.0

While Not KeyDown(1)

	TimeStep = TimeStep + .01 * Dir
	If TimeStep >= 1.0 Dir = - 1
	If TimeStep <= 0.0 Dir = 1.0 

	MESHmorph( VISIBLE , TUBE, FLAT , TimeStep )

	RenderWorld()
	Flip

Wend

;====================================================================================
;====================================================================================
;====================================================================================

Function MESHmorph( Source , Initial , Final , T# )

	ss = GetSurface( Source , 1 )
	is = GetSurface( Initial , 1 )
	fs = GetSurface( Final , 1 )
	
	For v = 0 To CountVertices( ss ) - 1
	
		Nx# = VertexX( is, v ) + ( VertexX( fs , v ) - VertexX( is , v ) ) * T
		Ny# = VertexY( is, v ) + ( VertexY( fs , v ) - VertexY( is , v ) ) * T
		Nz# = VertexZ( is, v ) + ( VertexZ( fs , v ) - VertexZ( is , v ) ) * T
		VertexCoords ss, v , Nx, Ny, Nz
		
	Next
	
End Function

;====================================================================================
;====================================================================================
;====================================================================================

Function MESHflat( Sx#, Sy#, Sz#, Segs = 8 )

	Mesh = CreateMesh()
	s = CreateSurface( Mesh )

	For l = 0 To Segs - 1
		a0# = - Sx + 2.0 * Sx * Float( l ) / Float( Segs )  
		a1# = - Sx + 2.0 * Sx * Float ( l + 1 ) / Float( Segs )
		u0# = Float(l) / Float( Segs )
		u1# = Float(l+1) / Float( Segs )
		DebugLog u0
		DebugLog u1
		DebugLog "**************"
		v0 = AddVertex( s , a0 , Sy, Sz , u0,0)
		v1 = AddVertex( s , a1 , Sy, Sz, u1,0)
		v2 = AddVertex( s , a1 , -Sy, Sz, u1,1 )
		v3 = AddVertex( s , a0, -Sy, Sz , u0,1)
		AddTriangle s, v0, v1, v2
		AddTriangle s, v2, v3, v0
	Next
	
	Return Mesh
		
End Function

;====================================================================================
;====================================================================================
;====================================================================================

Function MESHtube( Sx#, Sy#, Sz# , Segs = 8 )

	Mesh = CreateMesh()
	s = CreateSurface( Mesh )

	For l = 0 To Segs - 1
		a0# = 90.0 + l * 360.0 / Float( Segs )	;+90 important so starts at rear
		a1# = 90.0 + ( l + 1 ) * 360.0 / Float( Segs )
		u0# = Float( l/Segs ) 
		u1# = Float( (l+1)/Segs )
		v0 = AddVertex( s , Sx * Cos( a0 ) , Sy , Sz * Sin( a0 ),u0,0 )
		v1 = AddVertex( s , Sx * Cos( a1 ) , Sy , Sz * Sin( a1 ) ,u1,0)
		v2 = AddVertex( s , Sx * Cos( a1 ) , -Sy , Sz * Sin( a1 ),u1,1 )
		v3 = AddVertex( s , Sx * Cos( a0 ) , -Sy , Sz * Sin( a0 ),u0,1 )
		AddTriangle s, v0, v1, v2
		AddTriangle s, v2, v3, v0
	Next
	
	Return Mesh
End Function


Stevie

Thanks, Stevie G. This is what I've been working on since I posted earlier. Can't get it to look quite right, there's a sharp fold that appears when the page bends.

Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Global Camera,Light,Pivot,Mesh,Temp

Camera	= CreateCamera()
Light	= CreateLight()
Pivot	= CreatePivot()

MoveEntity Pivot,-5,0,0
TurnEntity Light,45,45,0
MoveEntity Camera,-5,15,-15
PointEntity Camera,Pivot

Temp = CreateQuad (10,10,10,0)
Mesh = CreateQuad (10,10,10,Pivot)

EntityFX Mesh,16

While Not KeyDown (1)
Cls

If EntityRoll (Pivot) < 179

	TurnEntity Pivot,0,0,1

	If EntityRoll (Pivot) < 60

		Curl (Mesh,1)

	EndIf
	
	If EntityRoll (Pivot) > 120

		Curl (Mesh,-1)

	EndIf

EndIf

If KeyDown (57) Then WireFrame True Else WireFrame False

If MouseHit (1)

	FreeEntity Mesh
	RotateEntity Pivot,0,0,0
	Mesh = CreateQuad (10,10,10,Pivot)
	EntityFX Mesh,16
	
EndIf

UpdateWorld
RenderWorld

Text 0,00," Space: Wireframe"
Text 0,10,"LMouse: Restart"

Flip
Wend
End

Function CreateQuad (W#,D#,Seg,Parent)

Local X,Z,V,V0,V1,V2,V3

Local Mesh		= CreateMesh()
Local Surf		= CreateSurface (Mesh)
Local HW#		= W/2.0
Local HD#		= D/2.0
Local DX# 		= 0.0
Local DZ# 		= 0.0
	
For X = 0 To Seg

	DX = X/Float(Seg)

	For Z = 0 To Seg

		DZ	= Z/Float(Seg)
		V	= AddVertex (Surf,DX*W-HW,0.0,DZ*D-HD,DX,DZ)
		
		VertexNormal (Surf,V,0,1,0)

	Next

Next

For X = 0 To Seg-1

	For Z = 0 To Seg-1

		V0 = X*(Seg+1)+Z
		V1 = X*(Seg+1)+Z+1
		V2 = (X+1)*(Seg+1)+Z+1
		V3 = (X+1)*(Seg+1)+Z
		
		AddTriangle (Surf,V0,V1,V2)
		AddTriangle (Surf,V0,V2,V3)

	Next

Next	

EntityParent Mesh,Parent
Return Mesh

End Function

Function Curl (Mesh,Dir)

Local Surface,A,Index,I#,Add#,NewX#,NewY#,NewZ#

For A = 1 To CountSurfaces (Mesh)

	Surface = GetSurface (Mesh,A)

		For Index = 0 To CountVertices (Surface)-1
		
			I		= I+1.8
			Add		= Sin (I)*0.05*Dir
			NewX	= VertexX(Surface,Index)
			NewY	= Add*VertexNY(Surface,Index)+VertexY(Surface,Index)
			NewZ	= VertexZ(Surface,Index)
			
			If Index <= 10
			
				NewX	= VertexX (Surface,Index)
				NewY	= VertexY (Surface,Index)
				NewZ	= VertexZ (Surface,Index)
			
			EndIf
			
			VertexCoords Surface,Index,NewX,NewY,NewZ
		
		Next
	
Next

End Function