Rotation 3d

Description

Code permettant de calculer la rotation d'un point en 3D autour d'un vecteur.

Source / Exemple :


'' Ne pas oublier d'initialiser la constante DEGTORAD permettant de convertir les degrée en radian
'' globalDEGTORAD As Double
'' Dans form.laod par exemple je rajoute :  DEGTORAD = (4 * Atn(1)) / 180
''
'' 
'---------------------------------------------------------------------------
' Point en 3D
'---------------------------------------------------------------------------
Public Type Point3
    X As Double
    Y As Double
    Z As Double
End Type

global PI As Double
global RADTODEG As Double
global DEGTORAD As Double

Function Rotation3D(Vect As Point3, Angle As Double, P1 As Point3) As Point3
   Dim MRotation(2, 2) As Double
   Dim Row As Integer
   Dim Col As Integer
   Dim Mid As Integer
   Dim I(2, 2) As Double
   Dim A(2, 2) As Double
   Dim A2(2, 2) As Double
   Dim Sn As Double
   Dim CosM1 As Double
   Dim AngleRadian As Double

   AngleRadian = Angle * DEGTORAD

   ' Matrice Identité
    I(0, 0) = 1: I(0, 1) = 0: I(0, 2) = 0:
    I(1, 0) = 0: I(1, 1) = 1: I(1, 2) = 0:
    I(2, 0) = 0: I(2, 1) = 0: I(2, 2) = 1:

   ' Rotation autour du vecteur
    A(0, 0) = 0:        A(0, 1) = -Vect.Z:  A(0, 2) = Vect.Y:
    A(1, 0) = Vect.Z:   A(1, 1) = 0:        A(1, 2) = -Vect.X:
    A(2, 0) = -Vect.Y:  A(2, 1) = Vect.X:   A(2, 2) = 0:

   ' A2 = A*A
    For Row = 0 To 2
        For Col = 0 To 2
            A2(Row, Col) = 0
            For Mid = 0 To 2
                A2(Row, Col) = A2(Row, Col) + A(Row, Mid) * A(Mid, Col)
            Next Mid
        Next Col
    Next Row
    Sn = Sin(AngleRadian)
    CosM1 = 1 - Cos(AngleRadian)

   ' rotation est I+sin(angle)*A+[1-cos(angle)]*A*A'
    For Row = 0 To 2
        For Col = 0 To 2
            MRotation(Row, Col) = I(Row, Col) + Sn * A(Row, Col) + CosM1 * A2(Row, Col)
        Next Col
    Next Row
    
    Rotation3D.X = MRotation(0, 0) * P1.X + MRotation(0, 1) * P1.Y + MRotation(0, 2) * P1.Z
    Rotation3D.Y = MRotation(1, 0) * P1.X + MRotation(1, 1) * P1.Y + MRotation(1, 2) * P1.Z
    Rotation3D.Z = MRotation(2, 0) * P1.X + MRotation(2, 1) * P1.Y + MRotation(2, 2) * P1.Z

End Function

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.