Another Camera Moves by Le Verdier12th Mar 2005 15:16
|
---|
Summary 3 Camera moves : Pan, Tripod, TrackBall.. Description 3 camera moving functions with a little command panel 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 |