TGC Codebase Backup



Another Camera Moves by Le Verdier

12th Mar 2005 15:16
Summary

3 Camera moves : Pan, Tripod, TrackBall..



Description

3 camera moving functions with a little command panel
to demonstrates them..
The TrackBall center can be changed...



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    Rem Globals 3d maths
Global CameraMoveStockVtr1
Global CameraMoveStockVtr2
Global CameraMoveStockMtx1
Global CameraMoveStockMtx2
Global CameraMoveStockMtx3
Global CameraMoveStockMtx4


Start:

   Set Camera View 64, 0, Screen Width(), Screen Height()

Rem Create your Scene...
   Make Object Cube 1, 1.0
   Position Object 1, -2.5,0.5,0.0

   Make Object Cone 2, 1.0
   Position Object 2, 2.5,0.5,0.0

   Make Object Sphere 3, 1.0
   Position Object 3, 0.0,0.5,2.5

   Make Object Cylinder 4, 1.0
   Position Object 4, 0.0,0.5,-2.5


   Make Matrix 1,8.0,8.0,4,4 : Position matrix 1,-4.0,0.0,-4.0


Rem Camera Init
   r = Make Vector3(2) : Rem Define a separated YawPitchRoll Vector

   Position Camera 0.0, 2.0, -8.0
   Set Vector3 2, 0.0, 0.0, 0.0
   Rotate Camera X Vector3(2), Y Vector3(2), 0.0 : Roll Camera Left Z Vector3(2)


Rem Draw Command Panel
   PanelBitmap = DrawCommandPanel()


Rem Create some 3d maths used in move functions..
   CameraMoveStockVtr1 = 3 : CameraMoveStockVtr2 = 4
   CameraMoveStockMtx1 = 5 : CameraMoveStockMtx2 = 6
   CameraMoveStockMtx3 = 7 : CameraMoveStockMtx4 = 8

   r = Make Vector3(CameraMoveStockVtr1) : r = Make Vector3(CameraMoveStockVtr2)
   r = Make Matrix4(CameraMoveStockMtx1) : r = Make Matrix4(CameraMoveStockMtx2)
   r = Make Matrix4(CameraMoveStockMtx3) : r = Make Matrix4(CameraMoveStockMtx4)


Rem Define TrackBallCenter Vector
   r = Make Vector3(1)
   Set Vector3 1, 0.0, 0.0, 0.0

   Set Current Bitmap 0
   Copy Bitmap PanelBitmap, 0

Rem Main Loop...
   Do
      k$ = INKEY$()
      Xm = MouseX() : Ym = MouseY()

      Box3D(0,128,64,64)

      If TestPointer(Xm, Ym, 0,0,32,32) : Rem command Triggers
         Ink RGB(0,0,0), 0 : Text 4, 132, "Pan XZ" : Rem write Command Name
         If MouseClick() = 1
            Xold = MouseX() : Yold = MouseY() : Hide Mouse
            CameraControlPan(0, 0, 2)
            Show Mouse : Position Mouse Xold, Yold
         EndIf
      EndIf

      If TestPointer(Xm, Ym, 32,0,32,32)
         Ink RGB(0,0,0), 0 : Text 4, 132, "Pan XY"
         If MouseClick() = 1
            Xold = MouseX() : Yold = MouseY() : Hide Mouse
            CameraControlPan(0, 1, 2)
            Show Mouse : Position Mouse Xold, Yold
         EndIf
      EndIf

      If TestPointer(Xm, Ym, 0,32,32,32)
         Ink RGB(0,0,0), 0 : Text 4, 132, "Tripod YP"
         If MouseClick() = 1
            Xold = MouseX() : Yold = MouseY() : Hide Mouse
            CameraControlTripod(0, 0, 2)
            Show Mouse : Position Mouse Xold, Yold
         EndIf
      EndIf

      If TestPointer(Xm, Ym, 32,32,32,32)
         Ink RGB(0,0,0), 0 : Text 4, 132, "Tripod RP"
         If MouseClick() = 1
            Xold = MouseX() : Yold = MouseY() : Hide Mouse
            CameraControlTripod(0, 1, 2)
            Show Mouse : Position Mouse Xold, Yold
         EndIf
      EndIf

      If TestPointer(Xm, Ym, 0,64,64,64)
         Ink RGB(0,0,0), 0 : Text 4, 132, "TrackBall XZ"
         If MouseClick() = 1
            Xold = MouseX() : Yold = MouseY() : Hide Mouse
            CameraControlTrackBallXZ(0, 2, 1)
            Show Mouse : Position Mouse Xold, Yold
         EndIf
      EndIf

      If k$ = "x" Then Exit
   Loop


   End

`_____________________________________________________________________________________________
Function DrawCommandPanel()
Rem Or load a cool bitmap...

   Bitmap = 1

   Create Bitmap Bitmap, 64, Screen Height()
   Rem P'tite Déco...
   Box 0,192,64,Screen Height(),RGB(64,96,96),RGB(224,224,224),RGB(64,96,96),RGB(224,224,224)
   Set Text Font "Tahoma" : Set Text Size 11

   Box3D(0,0,32,32)
   Ink RGB(0,0,0), 0 : Text 14, 1, "Z" : Text  4, 11, "X"

   Box3D(32,0,32,32)
   Ink RGB(0,0,0), 0 : Text 46, 1, "Y" : Text 36, 11, "X"

   Box3D(0,32,32,32)
   Ink RGB(0,0,0), 0 : Text 14, 33, "P" : Text  4, 43, "Y"
   Box3D(32,32,32,32)
   Ink RGB(0,0,0), 0 : Text 46, 33, "P" : Text 36, 43, "R"

   Box3D(0,64,64,64)
   Ink RGB(128,128,128), 0 : Circle 32, 96, 26
   Ink RGB(0,0,0), 0 : Text 30, 65, "P" : Text 4, 89, "Y"

EndFunction Bitmap


`_____________________________________________________________________________________________
Function Box3D(X,Y,W,H)

   Ink RGB(160,192,192),0 : Box X,Y,X+W,Y+H
   Ink RGB(224,255,255),0 : Line X,Y,X+W-1,Y : Line X,Y,X,Y+H
   Ink RGB(96,128,128),0  : Line X+1,Y+H-1,X+W-1,Y+H-1 : Line X+W-1,Y,X+W-1,Y+H

EndFunction

`_____________________________________________________________________________________________
Function TestPointer(Xm, Ym, X,Y,W,H)

   If (Xm < X) Then ExitFunction 0
   If (Ym < Y) Then ExitFunction 0
   If (Xm >= (X+W)) Then ExitFunction 0
   If (Ym >= (Y+H)) Then ExitFunction 0

EndFunction 1

`_____________________________________________________________________________________________
Function CameraControlPan(Camera, Mode, YPRVector)

   Xcs# = 0.0 : Ycs# = 0.0 : Zcs# = 0.0 : Rem Scrool Coords

   Translate Matrix4 CameraMoveStockMtx1, Camera Position X(), Camera Position Y(), Camera Position Z()

   Yaw#   = X Vector3(YPRVector) / 57.297 : Rem Convert To radians
   Pitch# = Y Vector3(YPRVector) / 57.297
   Roll#  = Z Vector3(YPRVector) / 57.297

   Rotate YPR Matrix4 CameraMoveStockMtx2, Yaw#, Pitch#, Roll#
   Multiply Matrix4 CameraMoveStockMtx2, CameraMoveStockMtx2, CameraMoveStockMtx1

   MMX# = MouseMoveX() : MMY# = MouseMoveY()
   Do
      MMX# = MouseMoveX() : MMY# = MouseMoveY() : Rem Input Mode ...

      ms# = 32.0 : Rem Mouse Speed..
      Xcs# = Xcs# + MMX#/ms#
      If Mode : rem XY Mode
         Ycs# = Ycs# - MMY#/ms#
      Else : rem XZ Mode
         Zcs# = Zcs# - MMY#/ms#
      EndIf

      Set Vector3 CameraMoveStockVtr1, -Xcs#,-Ycs#,-Zcs#
      Transform coords Vector3 CameraMoveStockVtr1,CameraMoveStockVtr1,CameraMoveStockMtx2
      X# = X Vector3(CameraMoveStockVtr1)
      Y# = Y Vector3(CameraMoveStockVtr1)
      Z# = Z Vector3(CameraMoveStockVtr1)
      If Camera
         Position Camera Camera, X#, Y#, Z#
      Else
         Position Camera X#, Y#, Z#
      EndIf

      If MouseClick() = 0 Then Exit : Rem Exiting Condition
   Loop

EndFunction

`_____________________________________________________________________________________________
Function CameraControlTripod(Camera, Mode, YPRVector)

   Yaw#   = X Vector3(YPRVector)
   Pitch# = Y Vector3(YPRVector)
   Roll#  = Z Vector3(YPRVector)

   mYaw# = 0.0 : mPitch# = 0.0 : mRoll# = 0.0

   MMX# = MouseMoveX() : MMY# = MouseMoveY()
   Do
      MMX# = MouseMoveX() : MMY# = MouseMoveY()

      ms# = 4.0
      mPitch# = mPitch# - MMY#/ms#
      If Mode : Rem Pitch/Roll Mode
         mRoll# = mRoll# - MMX#/ms#
      Else : Rem Yaw/Roll Mode
         mYaw# = mYaw# - MMX#/ms#
      EndIf

      If Camera
         Rotate Camera Camera, Pitch#+mPitch#, Yaw#+mYaw#, 0.0: Roll Camera Left Roll#+mRoll#
      Else
         Rotate Camera Pitch#+mPitch#, Yaw#+mYaw#, 0.0 : Roll Camera Left Roll#+mRoll#
      EndIf

      If MouseClick() = 0 Then Exit
   Loop

   Set Vector3 YPRVector, WrapValue(Yaw#+mYaw#), WrapValue(Pitch#+mPitch#), WrapValue(Roll#+mRoll#)

EndFunction


`____________________________________________________________________________________________
Function CameraControlTrackBallXZ(Camera, YPRVector, TrackBallCenterVector)

   Yaw#   = X Vector3(YPRVector)
   Pitch# = Y Vector3(YPRVector)
   Roll#  = Z Vector3(YPRVector)

   CameraMoveTBCX# = X Vector3(TrackBallCenterVector)
   CameraMoveTBCY# = Y Vector3(TrackBallCenterVector)
   CameraMoveTBCZ# = Z Vector3(TrackBallCenterVector)

   Translate Matrix4 CameraMoveStockMtx1, CameraMoveTBCX#, CameraMoveTBCY#, CameraMoveTBCZ#

   If Camera
      X# = Camera Position X(Camera) - CameraMoveTBCX#
      Y# = Camera Position Y(Camera) - CameraMoveTBCY#
      Z# = Camera Position Z(Camera) - CameraMoveTBCZ#
   Else
      X# = Camera Position X() - CameraMoveTBCX#
      Y# = Camera Position Y() - CameraMoveTBCY#
      Z# = Camera Position Z() - CameraMoveTBCZ#
   EndIf

   Set Vector3 CameraMoveStockVtr1, X#, Y#, Z#

   maY# = 0.0 : maX# = 0.0
   MMX# = MouseMoveX() : MMY# = MouseMoveY()
   Do
      MMX# = MouseMoveX() : MMY# = MouseMoveY()

      ms# = 4.0
      maY# = maY# - MMX#/ms# : maX# = maX# - MMY#/ms#
      Rem maY#: Additionnal Yaw   maX#: Additionnal Pitch

      Rem Move the base Circle to a local space where TBCenter at 0,0,0
      Rem and do a first Rotate of the camera on Y axis of this local space
      rem with changed Yaw
      Rotate Y Matrix4 CameraMoveStockMtx2, maY# / 57.297
      Multiply Matrix4 CameraMoveStockMtx3, CameraMoveStockMtx2, CameraMoveStockMtx1
      Transform Coords Vector3 CameraMoveStockVtr2, CameraMoveStockVtr1,CameraMoveStockMtx3

      Rem Sets a Move from 0,0,0 to world space TBC Coords. Used after...
      X# = X Vector3(CameraMoveStockVtr2)
      Y# = Y Vector3(CameraMoveStockVtr2)
      Z# = Z Vector3(CameraMoveStockVtr2)
      Translate Matrix4 CameraMoveStockMtx2, X#, CameraMoveTBCY#, Z#

      Rem The Next Goal:
      Rem Create and transform a vector so that the pitch rotation be done
      rem around an axis wich is pararel to the X Axis of camera space and pass at TBC
      rem The XZ plane of the camera space stays paralel to XZ of World space

      rem Vector Camera to TBC
      X# = CameraMoveTBCX# - X# : Y# = CameraMoveTBCY# - Y# : Z# = CameraMoveTBCZ# - Z#
      Set Vector3 CameraMoveStockVtr2, X#, Y#, Z#

      Rem Rotate, to be in camera space
      Rotate Y Matrix4 CameraMoveStockMtx3, (-Yaw#-maY#) / 57.297
      Transform Coords Vector3 CameraMoveStockVtr2, CameraMoveStockVtr2, CameraMoveStockMtx3

      Rem project Vector to YZ Plane and move back so that TBC be on the Y Axis,
      Rem in order to use X axis rotation
      Y#  = Y Vector3(CameraMoveStockVtr2)
      ZZ# = Z Vector3(CameraMoveStockVtr2)
      Set Vector3 CameraMoveStockVtr2, 0.0, -Y#, -ZZ#

      Rem Set The total Yaw Rotate to restore vector in World Space
      Rotate Y Matrix4 CameraMoveStockMtx3, (Yaw#+maY#) / 57.297

      Rem Rotate Vector with changed pitch and restore to camera space
      Rotate X Matrix4 CameraMoveStockMtx4, maX# / 57.297
      Transform Coords Vector3 CameraMoveStockVtr2, CameraMoveStockVtr2, CameraMoveStockMtx4
      X# = X Vector3(CameraMoveStockVtr2)
      Y# = Y Vector3(CameraMoveStockVtr2)
      Z# = Z Vector3(CameraMoveStockVtr2)
      Set vector3 CameraMoveStockVtr2, X#, Y#, Z#+ZZ#

      Rem Do total Yaw Rotation..
      Transform Coords Vector3 CameraMoveStockVtr2, CameraMoveStockVtr2, CameraMoveStockMtx3

      Rem Final Move to World Space..
      Transform Coords Vector3 CameraMoveStockVtr2, CameraMoveStockVtr2, CameraMoveStockMtx2

      X# = X Vector3(CameraMoveStockVtr2)
      Y# = Y Vector3(CameraMoveStockVtr2)
      Z# = Z Vector3(CameraMoveStockVtr2)

      Position Camera X#, Y#, Z#
      Rotate Camera Pitch#+maX#, Yaw#+maY#, 0.0 : Roll Camera Left Roll#

      If Camera
         Position Camera Camera, X#, Y#, Z#
         Rotate Camera Camera, Pitch#+maX#, Yaw#+maY#, 0.0 : Roll Camera Left Roll#
      Else
         Position Camera X#, Y#, Z#
         Rotate Camera Pitch#+maX#, Yaw#+maY#, 0.0 : Roll Camera Left Roll#
      EndIf

      If MouseClick() = 0 Then Exit
   Loop

   Set Vector3 YPRVector, WrapValue(Yaw#+maY#), WrapValue(Pitch#+maX#), Roll#

EndFunction