Code archives/3D Graphics - Effects/3D line function the sequel

This code has been declared by its author to be Public Domain code.

Download source code

3D line function the sequel by Blitzplotter2010
Demonstrates the power of Yasha's 3D line code with an array that can be modified by changing the xgap, ygap & zgap parameters.

Thanks to Yasha for posting the 3D line function in the first place, great little slice of code.
;Global appheight=768
;Global appwidth=1024
;Global appdepth=32

Global appheight=800
Global appwidth=800
Global appdepth=32

AppTitle "Blitzplotter, plotting Balls using an array with a little help from Yasha";,"Are you sure you want to quit?"

Local SC_FPS=60	;Desired framerate
Local rtime=Floor(1000.0/SC_FPS)
Local ctime,limited=True
Local FPScount,FPStime,FPSframes

Graphics3D appwidth,appheight,appdepth,6
SetBuffer BackBuffer()

;Create an empty scene
Local centrecam=CreatePivot()
PositionEntity centrecam,0,25,0
Local camera=CreateCamera(centrecam)
PositionEntity camera,0,20,-50,1

Local sun=CreateLight()
PositionEntity sun,-100,400,0
PointEntity sun,centrecam

Local ground=CreateMesh(),tiles=CreateSurface(ground)
Local v1=AddVertex(tiles,-125,0,150),v2=AddVertex(tiles,125,0,150),v3=AddVertex(tiles,125,0,-100)
AddTriangle(tiles,v1,v2,v3):v2=AddVertex(tiles,-125,0,-100):AddTriangle(tiles,v1,v3,v2)
EntityColor ground,0,0,255
Local block=CreateCube():ScaleMesh block,20,5,20

Local linemesh=CreateMesh(camera),linesurf=CreateSurface(linemesh)	;The surface to use to draw the lines - single surface is always faster
;Adjust the surface's colour here, or add vertex colours to the drawing function as necessary

Local marker1=CreateSphere():PositionEntity marker1,-5,15,-5:EntityAlpha marker1,0.3	;Mark the ends of the line in 3D space
Local marker2=CreateSphere():PositionEntity marker2,5,25,5:EntityAlpha marker2,0.3

;my marker

Local marker3=CreateSphere():PositionEntity marker3,5,35,15:EntityAlpha marker3,0.3


;#####      3d point creation array     #####
;#####                                  #####

MAXBALLS#=100

;array to hold a few 3d points
Dim ay(100,2)

;how many balls do you want plotted
Global extrapoints=80

If extrapoints>MAXBALLS
	Print"The array is only 100 big... please reduce your balls"
	Print"Press any key"
	WaitKey
	End
EndIf


;populate First 10 co-ords of array
xGap=2   ;distance in the xplane between points
yGap=3	 ;distance in the yplane between points
zGap=2   ;distance in the zplane between points

slope_in_zed=1  ;1 adjusts co-ords in the z plane, 0 doesn't

;populate array with 3d points for a zig zag effect
For x = 1 To extrapoints
	ay(x,0) = x*xGap;  x co-ords
	
	
	If x Mod 2 = 1; y co-ords up and down
		ay(x,1) = x * -yGap
	Else
		ay(x,1) = x * yGap
	EndIf
	
	If slope_in_zed=1
		If x Mod 2 = 1; z co-ords up and down
			ay(x,2) = x * -zGap
		Else
			ay(x,2) = x * zGap
		EndIf
	Else
		ay(x,2) = x*zGap; constant z co-ords
	EndIf

	;print out the co-ordinates
;	Print "x: "+ay(x,0)+" y: "+ay(x,1)+" z: "+ay(x,2)
;	
;	Print" "
	
Next

;Print" Press any key...."
Print " "
Print " "
Print " "
;WaitKey

;#####                             #####
;#####  end point creation         #####
;#####                             #####



Dim marker(4)

;this plots the spheres from the points within the array

For cz = 1 To extrapoints
	
	Local marker5=CreateSphere():PositionEntity marker5,5+ay(cz,0),35+ay(cz,1),15+ay(cz,2):EntityAlpha marker5,0.3
	
Next



While Not KeyDown(1)
	ctime=MilliSecs()
	
	MoveEntity camera,0,KeyDown(200)-KeyDown(208),KeyDown(30)-KeyDown(44)
	TurnEntity centrecam,0,KeyDown(203)-KeyDown(205),0
	PointEntity camera,centrecam
	RenderWorld
	
	ClearSurface linesurf	;If you redraw each frame as with standard drawing commands
	Draw3DLine(camera,linesurf,-5,15,-5,5,25,5,4)
	
	;introducing the third point
	Draw3DLine(camera,linesurf,5,25,5,5,35,15,4)
	
	linethick=2
	
	;;iterating through the array of co-ordinates:-
	For ct = 1 To extrapoints
		
		;prototype new Draw 3D Linw which will march through a pre-defined set of points within an array
		Draw3DLine(camera,linesurf,5+ay(ct,0),35+ay(ct,1),15+ay(ct,2),5+ay(ct+1,0),35+ay(ct+1,1),15+ay(ct+1,2),linethick)
		
	Next
	
	
	If MilliSecs()-FPStime=>1000 Then FPScount=FPSframes:FPSframes=0:FPStime=MilliSecs():Else FPSframes=FPSframes+1
	Text 0,30,"FPS: "+FPScount
	Text 0,60,"Arrow keys to turn camera, A and Z to zoom"
	
	Delay (rtime-(MilliSecs()-ctime))-(limited+1)		;Free spare CPU time
	Flip limited
Wend

End


Function Draw3DLine(camera,surf,x1#,y1#,z1#,x2#,y2#,z2#,thickness#=1,entity=0)	;If entity is not 0, points refer to an entity's local space
	TFormPoint x1,y1,z1,entity,camera
	x1=TFormedX()
	y1=TFormedY()
	z1=TFormedZ()
	Local d1#=Sqr(x1*x1+y1*y1+z1*z1)/GraphicsWidth()
	TFormPoint x2,y2,z2,entity,camera
	x2=TFormedX()
	y2=TFormedY()
	z2=TFormedZ()
	Local d2#=Sqr(x2*x2+y2*y2+z2*z2)/GraphicsWidth()
	
	Local theta#=ATan2(y2*(d1/d2)-y1,x2*(d1/d2)-x1)
	Local xTForm#=Cos(theta)*thickness
	Local yTForm#=Sin(theta)*thickness
	
	Local V0=AddVertex(surf,x1+yTForm*d1,y1-xTForm*d1,z1)
	Local V1=AddVertex(surf,x1-yTForm*d1,y1+xTForm*d1,z1)
	Local V2=AddVertex(surf,x2-yTForm*d2,y2+xTForm*d2,z2)
	Local V3=AddVertex(surf,x2+yTForm*d2,y2-xTForm*d2,z2)
	
	AddTriangle(surf,V0,V1,V2)
	AddTriangle(surf,V2,V3,V0)
End Function

Comments

Blitzplotter2010
added a 2nd and third graph, the definition of the plotted points is within the lines_4.bb and lines_5.bb files. Make sure lines_4.bb and lines_5.bb is in the same directory as the 'main' piece of code that includes the other two:-










Code Archives Forum