Need help with my viewer...

Blitz3D Forums/Blitz3D Programming/Need help with my viewer...

Pongo(Posted 2004) [#1]
edit: Problems solved and fixed code is in this post. Only leaving this here in case someone else finds it usefull.

> part of original post.....
Can someone please help with this? I'm really close to what I'm trying to do, but I've got a few things I don't know how to fix. What I'm trying to do is create a viewer/editor for some of my files, and I want my camera to be able to orbit around and zoom in on selected items.
Controls are as follows,... hold down alt and click the left button to orbit,... hold down the middle button to pan. The mouse wheel zooms in and out. The right button allows to select an object, and the camera will center on that object.

> Questions removed since problem was solved.

Thanks.



Graphics3D 800,600,0,2


;create the camera rig
Global mxs,mys	;for saving mouse x and y speed
Global current_pick	;for saving current picked object						
Global campiv_h=CreatePivot()			;This is the master camera pivot,... it controls position and horizontal rotation
Global campiv_v=CreatePivot(campiv_h)	;This controls vertical rotation
Global cam=CreateCamera(campiv_v)

Global hor_rot# = -45 					;Set horizontal orbit
Global ver_rot# = 20					;set Vert orbit

MoveEntity cam,0,0,-20					;move the camera back a bit
RotateEntity campiv_h,0,hor_rot,0		
RotateEntity campiv_v,ver_rot,0,0

;hide windows cursor and create a crosshair cursor
HidePointer()
Global cursor=CreateImage(16,16)
SetBuffer ImageBuffer(cursor)
Line 1,7,15,7
Line 1,9,15,9
Line 7,1,7,15
Line 9,1,9,15


SetBuffer BackBuffer() 

;###############
; create an axis icon 
Global axis_center = CreatePivot()

axis1 = CreateCube(axis_center)
ScaleEntity axis1,.05,.05,10
EntityColor axis1,0,0,255 

axis2 = CreateCube(axis_center)
ScaleEntity axis2,.05,10,.05
EntityColor axis2,0,255,0

axis3 = CreateCube(axis_center)
ScaleEntity axis3,10,.05,.05
EntityColor axis3,255,0,0
;###############


;create a few cubes to pick
cube=CreateCube()
EntityColor cube,255,100,100
EntityPickMode cube,2 ; allow to be picked (poly pick)

Dim cubes(20) ;create an array of 20 cubes to pick
For i=1 To 20
	cubes(i)=CopyEntity (cube)
	PositionEntity cubes(i),Rnd(50)-25,0,Rnd(50)-25 ;position randomly
	EntityColor cubes(i),Rnd(255),Rnd(255),Rnd(255)
Next 

light=CreateLight(2)
MoveEntity light,500,800,0


;********************************************************************************
;Main loop

While Not KeyDown(1)
	
	mxs=MouseXSpeed() ; store mouse x and y speeds
	mys=MouseYSpeed()

	If KeyDown(56) And MouseDown(1) Then orbit_cam() 	;if alt and middle mouse button pressed,... do orbit
	If MouseDown(3) Then Pan_cam()		;if middle mouse button pressed,... do pan

		
	If MouseHit(2) Then pick_object()	; if an object is right clicked, move the camera to that object
				
	MoveEntity cam,0,0,MouseZSpeed()*2 ; move the camera back/forth based on mouse wheel


	UpdateWorld()
	RenderWorld()
	
	
	;Print out some misc junk
	Text 50,10,"Selected Object: "+Str(current_pick)
	Text 50,25,"x:"+PickedX()
	Text 50,40,"y:"+PickedY()
	Text 50,55,"z:"+PickedZ()
	If PickedEntity() Then Text 50,70,"Name:"+EntityName$(PickedEntity())
	
	
	
	DrawImage cursor,MouseX(),MouseY()
	
	Flip

Wend ; end main loop

End ; end program

;********************************************************************************


Function orbit_cam()

	hor_rot=(hor_rot - (mxs*.5) ) ; get the mouse x and y speed,... adjust sensitivity by half
	ver_rot=(ver_rot + (mys*.5) )
 
	RotateEntity campiv_h,0,hor_rot,0 ; update the new camera pivot rotations
	RotateEntity campiv_v,ver_rot,0,0
	
End Function


;###############
Function pan_cam()
	MoveEntity campiv_h,-mxs*.1,0,mys*.1
	PositionEntity axis_center,EntityX(campiv_h),EntityY(campiv_h),EntityZ(campiv_h) ;position the axis at the camera pivot
End Function


;###############
Function pick_object() 
	current_pick = CameraPick (cam,MouseX(),MouseY()) ; do a pick at the mouse location
	
	If PickedEntity() >0 Then ; if an object was picked,... move the camera center to that location
	
PositionEntity campiv_h,EntityX(current_pick),EntityY(current_pick),EntityZ(current_pick)
PositionEntity axis_center,EntityX(campiv_h),EntityY(campiv_h),EntityZ(campiv_h) ;position the axis at the camera pivot
	;PositionEntity campiv_h,PickedX(),PickedY(),PickedZ()
	;PositionEntity axis_center,PickedX(),PickedY(),PickedZ()   
	EndIf
	
End Function
 



Bot Builder(Posted 2004) [#2]
C above. prob. solved.


Pongo(Posted 2004) [#3]
Ahhh,... I see what I was missing now,... thanks for the response.

I posted my latest version with fix in the original above in case anyone finds it usefull


Bot Builder(Posted 2004) [#4]
k. I'll remove my fix then