3D-Drehungen

Räumliche = große = finite Drehungen in 3D

  • Es geht um zwei Bezugssysteme: Das grüne \((x,y,z)\)-System und das blaue \((\bar x, \bar y,\bar z)\)-System.

  • Es geht um die Passive Transformation in 3D für den Spezialfall, dass um eine der 3 Achsen des Bezugssystems gedreht wird. Die Aktive Transformation ist auch abgedeckt, wie in 2D gezeigt wurde.

  • Es geht um die Umrechnung von Vektor- und Tensorkomponenten unter diesem Wechsel des Bezugssystems.

  • In 2D können die Lagen zweier Bezugssystem sich nur unterscheiden in ihrer Winkelposition. Man braucht daher nur eine Zahl (und die Festlegung einer positiven Zählrichtung), um die Lage des einen Bezugssystems relativ zum anderen zu beschreiben.

  • In 3D braucht man drei Zahlen (und Zählrichtungen). Und es gibt viele Möglichkeiten, um die Lage des einen Bezugssystems relativ zum anderen zu beschreiben, siehe hier.

  • Alle Drehungen in 3D lassen sich beschreiben als Hintereinanderschaltung von Drehungen (wie in in 2D) um eine Achse, die sich die Bezugssysteme „teilen“.

  • Die Gesamt-Drehung lässt sich (wie in 2D) mit einer Drehmatrix beschreiben.

  • Weitere Infos hier.

Beispiele

Drehachse \(z = \bar z\)

../../../_images/trafo_vector_3D_z.png
\begin{align*} \begin{bmatrix} v_{\bar x} \\ v_{\bar y} \\ v_{\bar z} \end{bmatrix} &= \underbrace{ \begin{bmatrix} c_\varphi & s_\varphi & 0 \\ -s_\varphi & c_\varphi& 0 \\ 0 & 0 & 1 \end{bmatrix} }_{R_\varphi} \begin{bmatrix} v_x \\ v_y \\ v_z \end{bmatrix} \\ \begin{bmatrix} 3{,}65 \\ 3{,}42 \\ 5 \\ \end{bmatrix} &\stackrel{0{,}01}{\approx} \begin{bmatrix} c_{10^\circ} & s_{10^\circ} & 0 \\ -s_{10^\circ} & c_{10^\circ} & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} 3 \\ 4 \\ 5 \\ \end{bmatrix} \\ \\ \begin{bmatrix} T_{\bar x \bar x} & T_{\bar x\bar y} & T_{\bar x\bar z} \\ & T_{\bar y\bar y} & T_{\bar y\bar z} \\ \mathsf{sym} & & T_{\bar z\bar z} \end{bmatrix} &= R_\varphi \begin{bmatrix} T_{xx} & T_{xy} & T_{xz} \\ & T_{yy} & T_{yz} \\ \mathsf{sym} & & T_{zz} \end{bmatrix} R_\varphi^{\mathsf T} \\ \begin{bmatrix} 0{,}55 & 4{,}78 & 0{,}0\\ & 3{,}45 & 0{,}0\\ \mathsf{sym} & & 6{,}0 \end{bmatrix} &\stackrel{0{,}01}{\approx} R_\varphi \begin{bmatrix} -1 & 4 & 0\\ 4 & 5 & 0\\ 0 & 0 & 6 \end{bmatrix} R_\varphi^{\mathsf T} \end{align*}

Drehachse \(x = \bar x\)

../../../_images/trafo_vector_3D_x.png
\begin{align*} \begin{bmatrix} v_{\bar x} \\ v_{\bar y} \\ v_{\bar z} \\ \end{bmatrix} &= \underbrace{ \begin{bmatrix} 1 & 0 & 0 \\ 0 & c_\varphi & s_\varphi \\ 0 & -s_\varphi & c_\varphi \\ \end{bmatrix} }_{R_\varphi} \begin{bmatrix} v_x \\ v_y \\ v_z \\ \end{bmatrix} \\ \begin{bmatrix} 5 \\ 3{,}65 \\ 3{,}42 \\ \end{bmatrix} &\stackrel{0{,}01}{\approx} \begin{bmatrix} 1 & 0 & 0 \\ 0 & c_{10^\circ} & s_{10^\circ} \\ 0 & -s_{10^\circ} & c_{10^\circ} \\ \end{bmatrix} \begin{bmatrix} 5 \\ 3 \\ 4 \\ \end{bmatrix} \\ \\ \begin{bmatrix} 666{,}0 & 0{,}0 & 0{,}0\\ 0{,}0 & 844{,}46 & -110{,}81\\ 0{,}0 & -110{,}81 & 235{,}54 \end{bmatrix} &\stackrel{0{,}01}{\approx} R_\varphi \begin{bmatrix} 666 & 0 & 0\\ 0 & 864 & 0\\ 0 & 0 & 216 \end{bmatrix} R_\varphi^{\mathsf T} \end{align*}

Details

Zyklisches Vertauschen \((x,y,z)\mapsto(y, z, x)\) in (z) liefert:

\[\begin{split}\begin{bmatrix} v_{\bar y} \\ v_{\bar z} \\ v_{\bar x} \\ \end{bmatrix} &= \begin{bmatrix} c_\varphi & s_\varphi & 0 \\ -s_\varphi & c_\varphi& 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} v_y \\ v_z \\ v_x \\ \end{bmatrix} \\ \leadsto \begin{bmatrix} v_{\bar x} \\ v_{\bar y} \\ v_{\bar z} \\ \end{bmatrix} &= \begin{bmatrix} 0 & 0 & 1 \\ c_\varphi & s_\varphi & 0 \\ -s_\varphi & c_\varphi& 0 \\ \end{bmatrix} \begin{bmatrix} v_y \\ v_z \\ v_x \\ \end{bmatrix} \\ &= \begin{bmatrix} 1 & 0 & 0 \\ 0 & c_\varphi & s_\varphi \\ 0 & -s_\varphi & c_\varphi \\ \end{bmatrix} \begin{bmatrix} v_x \\ v_y \\ v_z \\ \end{bmatrix}\end{split}\]

Drehachse y = ȳ

../../../_images/trafo_vector_3D_y.png
\begin{align*} \begin{bmatrix} v_{\bar x} \\ v_{\bar y} \\ v_{\bar z} \\ \end{bmatrix} &= \underbrace{ \begin{bmatrix} c_\varphi & 0 & -s_\varphi\\ 0 & 1 & 0 \\ s_\varphi & 0 & c_\varphi \\ \end{bmatrix} }_{R_\varphi} \begin{bmatrix} v_x \\ v_y \\ v_z \\ \end{bmatrix} \\ \begin{bmatrix} 3{,}42 \\ 5 \\ 3{,}65 \\ \end{bmatrix} &\stackrel{0{,}01}{\approx} \begin{bmatrix} c_{10^\circ} & 0 & -s_{10^\circ}\\ 0 & 1 & 0 \\ s_{10^\circ} & 0 & c_{10^\circ} \\ \end{bmatrix} \begin{bmatrix} 4 \\ 5 \\ 3 \\ \end{bmatrix} \end{align*}

Details

Zyklisches Vertauschen \((x,y,z)\mapsto(z, x, y)\) in (z) liefert:

\[\begin{split}\begin{bmatrix} v_{\bar z} \\ v_{\bar x} \\ v_{\bar y} \\ \end{bmatrix} &= \begin{bmatrix} c_\varphi & s_\varphi & 0 \\ -s_\varphi & c_\varphi& 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} v_z \\ v_x \\ v_y \\ \end{bmatrix} \\ \leadsto \begin{bmatrix} v_{\bar x} \\ v_{\bar y} \\ v_{\bar z} \\ \end{bmatrix} &= \begin{bmatrix} -s_\varphi & c_\varphi& 0 \\ 0 & 0 & 1 \\ c_\varphi & s_\varphi & 0 \\ \end{bmatrix} \begin{bmatrix} v_z \\ v_x \\ v_y \\ \end{bmatrix} \\ &= \begin{bmatrix} c_\varphi & 0 & -s_\varphi\\ 0 & 1 & 0 \\ s_\varphi & 0 & c_\varphi \\ \end{bmatrix} \begin{bmatrix} v_x \\ v_y \\ v_z \\ \end{bmatrix}\end{split}\]

Web-Apps dazu

SymPy

Nachfolgend ein Programm, dass Sie ausführen können:

  • Auf dem PC z.B. mit Anaconda.

  • Im Browser (online) in drei Schritten:

    1. Copy: Source Code in die Zwischenablage kopieren.

    2. Paste: Source Code als Python-Notebook einfügen z.B. auf:

    3. Play: Ausführen.

from sympy.physics.units import *
from sympy import *

# Units:
(mm, cm)  =  ( m/1000, m/100 )
kN        =  10**3*newton
Pa        =  newton/m**2
MPa       =  10**6*Pa
GPa       =  10**9*Pa
deg       =  pi/180
half      =  S(1)/2

# Rounding:
import decimal
from decimal import Decimal as DX
from copy import deepcopy
def iso_round(obj, pv,
    rounding=decimal.ROUND_HALF_EVEN):
    import sympy
    """
    Rounding acc. to DIN EN ISO 80000-1:2013-08
    place value = Rundestellenwert
    """
    assert pv in set([
        # place value   #  round to:
        "1",              #  round to integer
        "0.1",            #  1st digit after decimal
        "0.01",           #  2nd
        "0.001",          #  3rd
        "0.0001",         #  4th
        "0.00001",        #  5th        
        "0.000001",       #  6th
        "0.0000001",      #  7th
        "0.00000001",     #  8th
        "0.000000001",    #  9th
        "0.0000000001",   # 10th
        ])
    objc = deepcopy(obj)
    try:
        tmp = DX(str(float(objc)))
        objc = tmp.quantize(DX(pv), rounding=rounding)
    except:
        for i in range(len(objc)):
            tmp = DX(str(float(objc[i])))
            objc[i] = tmp.quantize(DX(pv), rounding=rounding)
    return objc

# Header ends here.

def get_R(phi, axis):
    c, s = cos(phi), sin(phi)
    if axis == "z":
        R = Matrix([
        [ c, s, 0],
        [-s, c, 0],
        [ 0, 0, 1],
        ])
    elif axis == "x":
        R = Matrix([
        [ 1, 0, 0],
        [ 0, c, s],
        [ 0,-s, c],
        ])
    elif axis == "y":
        R = Matrix([
        [ c, 0,-s],
        [ 0, 1, 0],
        [ s, 0, c],
        ])
    return R

pprint("\n(x,y,z)-Comp.:")
v = Matrix([3,4,5])
pprint(v)

phi = 10 *deg
R = get_R(phi,"z")
# R = get_R(phi,"x")
# R = get_R(phi,"y")

pprint("\n(x̄,ȳ,z̄)-Comp.:")
 = R*v
tmp = 
tmp = iso_round(tmp, "0.01")
pprint(tmp)

pprint("\n(x,y,z)-Comp.:")
Txx, Txy, Txz = 666, 0, 0
Tyy, Tyz = 864, 0
Tzz = 216
T = Matrix([
    [Txx, Txy, Txz],
    [Txy, Tyy, Tyz],
    [Txz, Tyz, Tzz]
    ])
pprint(T)

phi = 10 *deg
R = get_R(phi,"x")

pprint("\n(x̄,ȳ,z̄)-Comp.:")
 = R*T*R.transpose()
tmp = 
tmp = iso_round(tmp, "0.01")
pprint(tmp)
              
(x,y,z)-Comp.:
⎡3⎤
⎢ ⎥
⎢4⎥
⎢ ⎥
⎣5⎦
              
(x̄,ȳ,z̄)-Comp.:
⎡3.65⎤
⎢    ⎥
⎢3.42⎥
⎢    ⎥
⎣5.0 ⎦
              
(x,y,z)-Comp.:
⎡666   0    0 ⎤
⎢             ⎥
⎢ 0   864   0 ⎥
⎢             ⎥
⎣ 0    0   216⎦
              
(x̄,ȳ,z̄)-Comp.:
⎡666.0     0        0   ⎤
⎢                       ⎥
⎢  0    844.46   -110.81⎥
⎢                       ⎥
⎣  0    -110.81  235.54 ⎦

Statt SymPy lieber anderes CAS (Computeralgebrasystem) verwenden? Eine Auswahl verschiedener CAS gibt es hier.