Code archives/User Input/CameraMouseView

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

Download source code

CameraMouseView by markcw2005
I couldn't find any code here like this, so I thought I'd add this example. The drag code was the tricky bit, but it seems to be working nicely now.

This is the kind of camera control you get in Milkshape or UltimateUnwrap.

edit: i never liked the way this used a lot of globals, so i've updated it so it uses no globals and instead a bank to hold the "globals". i thought about types but decided this was better as it's simpler to transfer to a project this way.
;CameraMouseView, on 10/10/06

Graphics3D 640,480,0,2
SetBuffer BackBuffer()

camerapivot=CreatePivot() ;pivot
camera=CreateCamera(camerapivot) ;camera on pivot
camerabank=CreateBank(48) ;camera bank variables

light=CreateLight()
RotateEntity light,90,0,0

cube=CreateCube()

While Not KeyHit(1)
 UpdateWorld
 RenderWorld

 CameraMouseView(camerapivot,camera,camerabank)

 Text 0,0,"Press LShift to Zoom, LCtrl to Drag"

 Flip
Wend

Function CameraMouseView(camerapivot,camera,camerabank,speed#=0.05)
 ;camerapivot,camera,camerabank=valid handles, speed#=speed of view

 Local movex,movey,camx#,camy#,camz#,pivx#,pivz#,angle#,xaxis#,zaxis#

 ;error messages for invalid handles
 If camerapivot=0 Then RuntimeError "Pivot entity is zero!"
 If camera=0 Then RuntimeError "Camera entity is zero!"
 If camerabank=0 Then RuntimeError "Bank handle is zero!"

 ;set default values
 If speed#<0.01 Then speed#=0.01 ;min speed
 If PeekFloat(camerabank,36)=0 Then PokeFloat camerabank,36,-10 ;no camz

 ;update mouse variables
 PokeInt camerabank,0,PeekInt(camerabank,8) ;lastx=msex
 PokeInt camerabank,4,PeekInt(camerabank,16) ;lasty=msey
 PokeInt camerabank,8,MouseX() ;msex
 PokeInt camerabank,16,MouseY() ;msey
 PokeInt camerabank,20,MouseX()-PeekInt(camerabank,0) ;movex=msex-lastx
 PokeInt camerabank,24,MouseY()-PeekInt(camerabank,4) ;movey=msey-lasty

 ;fill in the position/rotation variables
 movex=PeekInt(camerabank,20)
 movey=PeekInt(camerabank,24)
 camx#=PeekFloat(camerabank,28)
 camy#=PeekFloat(camerabank,32)
 camz#=PeekFloat(camerabank,36)
 pivx#=PeekFloat(camerabank,40)
 pivz#=PeekFloat(camerabank,44)

 If MouseDown(1) ;Left Mouse button
  If KeyDown(29) ;Left Ctrl key, camera drag
   angle#=camy# : xaxis#=speed# : zaxis#=speed# ;init xz axis
   If angle#>90 And angle#<270 Then zaxis#=-zaxis# ;-z if 90..270
   If angle#>180 Then angle#=360-angle# : xaxis#=-xaxis# ;-x if 180..360
   If angle#>90 Then angle#=180-angle# ;reduce y angle to 90
   angle#=angle#*0.011 ;y as fraction of 1, ie. 90->100
   ;set mouse xy movements by y fraction and add to pivot xz positions
   pivx#=pivx#-(movex*(1-angle#)*zaxis#)-(movey*angle#*xaxis#)
   pivz#=pivz#-(movex*angle#*xaxis#)+(movey*(1-angle#)*zaxis#)
  ElseIf KeyDown(42) ;Left Shift key, camera zoom
   camz#=camz#-movey*speed#  ;-msey sets camera z mt
   If camz#>-3 Then camz#=-3 ;limit zoom to 3mt
  Else ;camera rotation
   camx#=camx#+(movey*10*speed#) ;mousey sets camera x dg
   If camx#>90 Then camx#=90   ;limit x to -90..90
   If camx#<-90 Then camx#=-90
   camy#=camy#-(movex*10*speed#) ;-mousex sets camera y dg
   If camy#>359 Then camy#=0   ;limit y to 0..360
   If camy#<0 Then camy#=359
  EndIf
 EndIf

 ;update position/rotation variables
 PokeFloat camerabank,28,camx#
 PokeFloat camerabank,32,camy#
 PokeFloat camerabank,36,camz#
 PokeFloat camerabank,40,pivx#
 PokeFloat camerabank,44,pivz#

 ;move pivot, rotate and zoom camera
 PositionEntity camerapivot,pivx#,0,pivz# ;drag
 RotateEntity camerapivot,camx#,camy#,0 ;rotate
 PositionEntity camera,0,0,camz# ;zoom

End Function

Comments

markcw2006
Here is the old code entry, just as a reminder.




Code Archives Forum