fb:porticula NoPaste
dof6.bi
Uploader: | ThePuppetMaster |
Datum/Zeit: | 31.10.2013 00:39:21 |
'##############################################################################################################################################
'6 Dimensions of Freedom for OGL
'##############################################################################################################################################
'Idea: 2013.10.25-22:19
'Author.: Martin Wiemann (freebasic@deltalabs.de)
'Licence: do what u want to do if u dont earn more many with this as me
'##############################################################################################################################################
'-How to use-
'1. add this .bi and call DOF6_Init() one time at start of your app
'2. use DOF6_AddAll to ad changeings in directions and position or the seperated functions
'3. add go OGL-Code:
' GLMatrixMode(GL_MODELVIEW)
' GLLoadIdentity()
' DOF6_MultiOGLModelMatrix()
' GLTranslateF(G_DOF6_Pos.X, G_DOF6_Pos.Y, G_DOF6_Pos.Z)
' GLPushMatrix()
' <your 3d code>
' GLPopMatrix()
'4. hf while fly around!
'
'To set the current position: G_DOF6_Pos = <new position vector>
'To reset the direction: DOF6_ResetDirection
'##############################################################################################################################################
Type Vector
X as Double
Y as Double
Z as Double
End Type
'##############################################################################################################################################
Const G_DEG2RAD as Double = 0.0174532925199
Const G_RAD2DEG as Double = 57.2957795131
'##############################################################################################################################################
Dim Shared G_DOF6_Pos as Vector
Dim Shared G_DOF6_Rot as Vector
Dim Shared G_DOF6_BaseX as Vector
Dim Shared G_DOF6_BaseY as Vector
Dim Shared G_DOF6_BaseZ as Vector
Dim Shared G_DOF6_MovX as Vector
Dim Shared G_DOF6_MovY as Vector
Dim Shared G_DOF6_MovZ as Vector
'##############################################################################################################################################
Function DOF6_Vector_Rotate(V_Vector as Vector, V_Direction as Vector, V_RAD as Double) as Vector
Dim TVec as Vector
Dim TCos as Double = Cos(V_RAD)
Dim TSin as Double = Sin(V_RAD)
Dim TM(1 to 3, 1 to 3) as Double
TM(1, 1) = (V_Direction.X * V_Direction.X) * (1 - TCos) + TCos
TM(1, 2) = (V_Direction.X * V_Direction.Y) * (1 - TCos) - (V_Direction.Z * TSin)
TM(1, 3) = (V_Direction.X * V_Direction.Z) * (1 - TCos) + (V_Direction.Y * TSin)
TM(2, 1) = (V_Direction.Y * V_Direction.X) * (1 - TCos) + (V_Direction.Z * TSin)
TM(2, 2) = (V_Direction.Y * V_Direction.Y) * (1 - TCos) + TCos
TM(2, 3) = (V_Direction.Y * V_Direction.Z) * (1 - TCos) - (V_Direction.X * TSin)
TM(3, 1) = (V_Direction.Z * V_Direction.X) * (1 - TCos) - (V_Direction.Y * TSin)
TM(3, 2) = (V_Direction.Z * V_Direction.Y) * (1 - TCos) + (V_Direction.X * TSin)
TM(3, 3) = (V_Direction.Z * V_Direction.Z) * (1 - TCos) + TCos
TVec.X = (V_Vector.X * TM(1, 1)) + (V_Vector.Y * TM(2, 1)) + (V_Vector.Z * TM(3, 1))
TVec.Y = (V_Vector.X * TM(1, 2)) + (V_Vector.Y * TM(2, 2)) + (V_Vector.Z * TM(3, 2))
TVec.Z = (V_Vector.X * TM(1, 3)) + (V_Vector.Y * TM(2, 3)) + (V_Vector.Z * TM(3, 3))
Return TVec
End Function
'----------------------------------------------------------------------------------------------------------------------------------------------
Sub DOF6_Vector_Normalize(RV_Vector as Vector)
With RV_Vector
Dim TDist as Double = Sqr((.X * .X) + (.Y * .Y) + (.Z * .Z))
.X /= TDist
.Y /= TDist
.Z /= TDist
End With
End Sub
'----------------------------------------------------------------------------------------------------------------------------------------------
Function DOF6_Vector_Dot(V_Vector1 as Vector, V_Vector2 as Vector) as Double
Dim TDot as Double
TDot += V_Vector1.X * V_Vector2.X
TDot += V_Vector1.X * V_Vector2.Y
TDot += V_Vector1.X * V_Vector2.Z
TDot += V_Vector1.Y * V_Vector2.X
TDot += V_Vector1.Y * V_Vector2.Y
TDot += V_Vector1.Y * V_Vector2.Z
TDot += V_Vector1.Z * V_Vector2.X
TDot += V_Vector1.Z * V_Vector2.Y
TDot += V_Vector1.Z * V_Vector2.Z
Return TDot
End Function
'----------------------------------------------------------------------------------------------------------------------------------------------
Function DOF6_Vector_Multi(V_Vector1 as Vector, V_Vector2 as Vector) as Vector
Dim TVec as Vector
TVec.X = V_Vector1.X * V_Vector2.X
TVec.Y = V_Vector1.Y * V_Vector2.Y
TVec.Z = V_Vector1.Z * V_Vector2.Z
Return TVec
End Function
'##############################################################################################################################################
Sub DOF6_MultiOGLModelMatrix()
Dim TRotX as Vector
Dim TRotY as Vector
Dim TRotZ as Vector
TRotX.X = G_DOF6_MovX.X
TRotX.Y = G_DOF6_MovY.X
TRotX.Z = G_DOF6_MovZ.X
TRotY.X = G_DOF6_MovX.Y
TRotY.Y = G_DOF6_MovY.Y
TRotY.Z = G_DOF6_MovZ.Y
TRotZ.X = G_DOF6_MovX.Z
TRotZ.Y = G_DOF6_MovY.Z
TRotZ.Z = G_DOF6_MovZ.Z
Dim TMat(0 to 15) as Double
TMat(0) = TRotX.X
TMat(1) = TRotX.Y
TMat(2) = TRotX.Z
TMat(3) = 0.0
TMat(4) = TRotY.X
TMat(5) = TRotY.Y
TMat(6) = TRotY.Z
TMat(7) = 0.0
TMat(8) = TRotZ.X
TMat(9) = TRotZ.Y
TMat(10) = TRotZ.Z
TMat(11) = 0.0
TMat(12) = 0.0
TMat(13) = 0.0
TMat(14) = 0.0
TMat(15) = 1.0
GLMultMatrixD(@TMat(0))
End Sub
'##############################################################################################################################################
Sub DOF6_RecalculateRot()
Dim TRotX as Vector
Dim TRotY as Vector
Dim TRotZ as Vector
TRotX.X = G_DOF6_MovX.X
TRotX.Y = G_DOF6_MovY.X
TRotX.Z = G_DOF6_MovZ.X
TRotY.X = G_DOF6_MovX.Y
TRotY.Y = G_DOF6_MovY.Y
TRotY.Z = G_DOF6_MovZ.Y
TRotZ.X = G_DOF6_MovX.Z
TRotZ.Y = G_DOF6_MovY.Z
TRotZ.Z = G_DOF6_MovZ.Z
DOF6_Vector_Normalize(TRotX)
DOF6_Vector_Normalize(TRotY)
DOF6_Vector_Normalize(TRotZ)
G_DOF6_Rot.X = -180 + DOF6_Vector_Dot(G_DOF6_BaseX, TRotX) * 180
G_DOF6_Rot.Y = -180 + DOF6_Vector_Dot(G_DOF6_BaseY, TRotY) * 180
G_DOF6_Rot.Z = -180 + DOF6_Vector_Dot(G_DOF6_BaseZ, TRotZ) * 180
End Sub
'##############################################################################################################################################
Sub DOF6_Init()
G_DOF6_BaseX.X = 1.0
G_DOF6_BaseY.Y = 1.0
G_DOF6_BaseZ.Z = 1.0
G_DOF6_MovX.X = 1.0
G_DOF6_MovY.Y = 1.0
G_DOF6_MovZ.Z = 1.0
DOF6_RecalculateRot()
End Sub
'##############################################################################################################################################
Sub DOF6_AddPitch(V_Value as Double)
Dim TValRAD as Double = V_Value * G_DEG2RAD
Dim TRotVec as Vector = G_DOF6_MovX
G_DOF6_MovX = DOF6_Vector_Rotate(G_DOF6_MovX, TRotVec, TValRAD)
G_DOF6_MovY = DOF6_Vector_Rotate(G_DOF6_MovY, TRotVec, TValRAD)
G_DOF6_MovZ = DOF6_Vector_Rotate(G_DOF6_MovZ, TRotVec, TValRAD)
DOF6_Vector_Normalize(G_DOF6_MovX)
DOF6_Vector_Normalize(G_DOF6_MovY)
DOF6_Vector_Normalize(G_DOF6_MovZ)
DOF6_RecalculateRot()
End Sub
'----------------------------------------------------------------------------------------------------------------------------------------------
Sub DOF6_AddYaw(V_Value as Double)
Dim TValRAD as Double = V_Value * G_DEG2RAD
Dim TRotVec as Vector = G_DOF6_MovY
G_DOF6_MovX = DOF6_Vector_Rotate(G_DOF6_MovX, TRotVec, TValRAD)
G_DOF6_MovY = DOF6_Vector_Rotate(G_DOF6_MovY, TRotVec, TValRAD)
G_DOF6_MovZ = DOF6_Vector_Rotate(G_DOF6_MovZ, TRotVec, TValRAD)
DOF6_Vector_Normalize(G_DOF6_MovX)
DOF6_Vector_Normalize(G_DOF6_MovY)
DOF6_Vector_Normalize(G_DOF6_MovZ)
DOF6_RecalculateRot()
End Sub
'----------------------------------------------------------------------------------------------------------------------------------------------
Sub DOF6_AddRoll(V_Value as Double)
Dim TValRAD as Double = V_Value * G_DEG2RAD
Dim TRotVec as Vector = G_DOF6_MovZ
G_DOF6_MovX = DOF6_Vector_Rotate(G_DOF6_MovX, TRotVec, TValRAD)
G_DOF6_MovY = DOF6_Vector_Rotate(G_DOF6_MovY, TRotVec, TValRAD)
G_DOF6_MovZ = DOF6_Vector_Rotate(G_DOF6_MovZ, TRotVec, TValRAD)
DOF6_Vector_Normalize(G_DOF6_MovX)
DOF6_Vector_Normalize(G_DOF6_MovY)
DOF6_Vector_Normalize(G_DOF6_MovZ)
DOF6_RecalculateRot()
End Sub
'----------------------------------------------------------------------------------------------------------------------------------------------
Sub DOF6_ResetDirection()
G_DOF6_MovX.X = 1.0
G_DOF6_MovY.Y = 1.0
G_DOF6_MovZ.Z = 1.0
DOF6_RecalculateRot()
End Sub
'##############################################################################################################################################
Sub DOF6_AddMoveX(V_Value as Double)
Dim TVal as Double = V_Value * -1
G_DOF6_Pos.X += G_DOF6_MovX.X * TVal
G_DOF6_Pos.Y += G_DOF6_MovX.Y * TVal
G_DOF6_Pos.Z += G_DOF6_MovX.Z * TVal
End Sub
'----------------------------------------------------------------------------------------------------------------------------------------------
Sub DOF6_AddMoveY(V_Value as Double)
Dim TVal as Double = V_Value * -1
G_DOF6_Pos.X += G_DOF6_MovY.X * TVal
G_DOF6_Pos.Y += G_DOF6_MovY.Y * TVal
G_DOF6_Pos.Z += G_DOF6_MovY.Z * TVal
End Sub
'----------------------------------------------------------------------------------------------------------------------------------------------
Sub DOF6_AddMoveZ(V_Value as Double)
Dim TVal as Double = V_Value * -1
G_DOF6_Pos.X += G_DOF6_MovZ.X * TVal
G_DOF6_Pos.Y += G_DOF6_MovZ.Y * TVal
G_DOF6_Pos.Z += G_DOF6_MovZ.Z * TVal
End Sub
'##############################################################################################################################################
Sub DOF6_AddAll(V_X as Double, V_Y as Double, V_Z as Double, V_Pitch as Double, V_Yaw as Double, V_Roll as Double)
If V_X <> 0 Then DOF6_AddMoveX(V_X)
If V_Y <> 0 Then DOF6_AddMoveY(V_Y)
If V_Z <> 0 Then DOF6_AddMoveZ(V_Z)
If V_Pitch <> 0 Then DOF6_AddPitch(V_Pitch)
If V_Yaw <> 0 Then DOF6_AddYaw(V_Yaw)
If V_Roll <> 0 Then DOF6_AddRoll(V_Roll)
End Sub