Tracking a Camera Thru 3d

Blitz3D Forums/Blitz3D Programming/Tracking a Camera Thru 3d

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Ok, here it is :o) I used arrays, as it's slightly easier to do i think. Comments in code, based on the above statement :o)

Graphics3D 800,600
SetBuffer BackBuffer()

Global camera = CreateCamera()
Global camera_pivot = CreateSphere() ; the pivot the camera will follow. SPHERE so you can see whats happening
Global light = CreateLight()


; set up some cubes, to see the camera moving properly
Dim scene(20)

For loop = 0 To 20
	scene(loop) = CreateCube()
	PositionEntity scene(loop),Rnd(-40,40),Rnd(-30,30),Rnd(-60,60)
	EntityColor scene(loop),Rnd(0,255),Rnd(0,255),Rnd(0,255)
Next


Global max_waypoints = 10 ; set the max waypoint number. You'll need to have enough data statements!
Dim waypoint(max_waypoints,2) ; dimention the array. 2 is for the 3 co-ords. 0 = x, y = 1, z= 2
For loop = 0 To max_waypoints
	Read waypoint(loop,0) ; read in the X co-ord
	Read waypoint(loop,1) ; read in the Y co-ord
	Read waypoint(loop,2) ; read in the X co-ord
Next


Global current_waypoint = 0 ; the current waypoint number
Global waypoint_marker = CreateSphere();Pivot() ; changed to a sphere, so you can see whats happening

;position the waypoint marker at the current waypoint number.
PositionEntity waypoint_marker,waypoint(current_waypoint,0),waypoint(current_waypoint,1),waypoint(current_waypoint,2)


While Not KeyHit(1)


	UpdateWorld
	update_camera(0.2)
	RenderWorld
	Flip
Wend
End


; function to make the pivot follow the waypoints and the camera follow the pivot
Function update_camera(speed#)
	
	
	PointEntity camera_pivot,waypoint_marker; point the camera pivot at the current waypoint marker
	MoveEntity camera_pivot,0,0,speed ; move the camera pivot ta a constant speed towards the marker
	PointEntity camera,camera_pivot ; point the camera at the camera pivot
	MoveEntity camera,0,0,EntityDistance#(camera,camera_pivot) / ((1/speed)*10); move the camera towards the pivot,
																			   ;based on the distance between the two for smooth movement

	If EntityDistance#(camera_pivot,waypoint_marker) < 1.2 Then ; if the camera pivot is close to the marker
		current_waypoint = current_waypoint + 1 ; increment the waypoint number
		If current_waypoint > max_waypoints Then ; if this causes it to exceed the max number of waypoints then
			current_waypoint = 0 ; set to back to 0 to loop the waypoints
		End If
		; BELOW, position the waypoint marker at the current (recently moved on ABOVE) waypoint position
		; using the values read into the array
		PositionEntity waypoint_marker,waypoint(current_waypoint,0),waypoint(current_waypoint,1),waypoint(current_waypoint,2)
	End If
	
End Function

;data for the waypoint positions

Data 0  ,10 ,10
Data 10 ,20 ,20
Data 30 ,5  ,30
Data 20 ,12 ,27
Data 10 ,12 ,-5
Data -10,23 ,-10
Data -30,-10,17
Data 30 ,0  ,6
Data 10 ,27 ,-26
Data 20 ,8  ,20
Data -20,0  ,0