Frage von Eyevi, 30

Objekt im 3 Dimensionalen Raum in Blickrichtung verschieben (EULER Winkel)?

Hallo Community,

ich möchte ein Objekt im Raum anhand seiner Ausrichtung verschieben. Als Programmiersprache wird hierzu Phyton und die VTK-Lib verwendet. Zur Berechnung mathematischer Dinge verwende ich NumPy.

Ich beschäftige mich nun seit mehr als eine Woche mit diesem Thema und komme auf keinen Grünen Zweig. Das Problem ist, dass sich das Objekt richtig bewegt, solange sich nur die Y Achse gedreht hat. Ist auch nur die kleinste Veränderung einer anderen Achse vorhanden, stimmt die Bewegung nicht.

Meine Methode gibt einen Vector an, welcher eine Richtung angibt. Diese Richtung soll nun anhand der Rotation des Objektes gedreht werden. (In Gameengines meistens .Move genannt) Im Anschluss soll das Objekt dann anhand des daraus resultierenden Vector bewegt werden. Hier der Code:


def moveEntity(self,x,y,z):

    vx=float(x)
    vy=float(y)
    vz=float(z)

    dVector = [vx,vy,vz]

    """------------------------------------"""

    a = np.deg2rad(self.__actor.GetOrientation()[0])
    B = np.deg2rad(self.__actor.GetOrientation()[1])
    y = np.deg2rad(self.__actor.GetOrientation()[2])
    

    rotZU = [np.cos(y),np.sin(y),0]
    rotZM = [-np.sin(y), np.cos(y),0]
    rotZD = [0,0,1]
    
    rotYU =[np.cos(B),0,-np.sin(B)]
    rotYM =[0,1,0]
    rotYD =[np.sin(B),0,np.cos(B)]
    
    rotXU =[np.cos(a),np.sin(a),0]
    rotXM =[-np.sin(a),np.cos(a),0]
    rotXD =[0,0,1]
    
    
    
    matRotZ = np.mat([rotZU,rotZM,rotZD])
    matRotY = np.mat([rotYU,rotYM,rotYD])
    matRotX = np.mat([rotXU,rotXM,rotXD])
    
    
    rotationsMatrix = (matRotZ * matRotY) * matRotX


    print "Rotationsmatrix "+str(rotationsMatrix)

    newDirection = dVector * rotationsMatrix
    
    newDirection = newDirection.A1
    
    print "Neue Ausrichtung "+str( newDirection)

    self.__actor.AddPosition(newDirection[0],newDirection[1],newDirection[2])

Ich habe mich streng an folgendes Beispiel gehalten:

http://easyspin.org/documentation/eulerangles.html

Allerdings scheint es nicht zu funktionieren...

Vielen Dank für eure Hilfe!!!

Antwort
von Melvissimo, 24

Musst du dVector nicht von rechts an die Matrix dranmultiplizieren? Ich stelle mir die Matrizen als Funktionen vor. 

Sagen wir z.B. f_X = matRotX ist die Funktion, die einen Vektor gemäß der Rotation um die z-Achse um den Winkel alpha anpasst. 

In der Anleitung ist diese Rotation der erste Schritt, d.h. das erste was wir ausrechnen müssen ist

f_X(dVector) = matRotX * dVector.

Erst dann wird f_Y auf den neuen Vektor angewendet und das Endergebnis wäre

f_Z(f_Y(f_X(dVector))) = matRotZ * (matRotY * (matRotX * dVector)))

= rotationsMatrix * dVector.

Um das tun zu können, müsste dVector allerdings ein Spaltenvektor sein, statt eines Zeilenvektors. Ich weiß nicht, wie Python das handhabt, aber gegebenenfalls müsstest du rotationsMatrix oder dVector transponieren.

Das war jedenfalls mein erster Gedanke zu deiner Frage; ich hoffe er hilft dir. [Falls ich Recht behalten sollte, wundere ich mich aber, dass bei Rotationen um die y-Achse alles stimmt...]

Kommentar von Eyevi ,

Stimmt das habe ich vergessen. Danke für die neuen Ansätze. Dennoch scheint es nicht zu funktionieren... Die Rotation auf der Y-Achse funktioniert nun immer noch und die Rotation auf der Z-Achse auch. (Beide nur solange um keine andere Achse rotiert wird.) Die Rotation um die X-Achse ist immer noch Buggy. Und wenn man mehrere Achsen gleichzeitig rotiert hat... darüber möchte ich gar nicht erst reden.

Kommentar von Melvissimo ,

Bist du dir sicher, dass du die Euler-Winkel richtig berechnest? 

Y-Rotation kann man leicht durch a = y = 0 simulieren und Z-Rotation kann man leicht durch a = B = 0 simulieren (oder auch B = y = 0, wenn man will). In beiden Fällen sind zwei der 3 Faktoren Einheitsmatrizen, d.h. da kann gar nicht so viel schiefgehen (ist es ja anscheinend auch nicht).

Aber bei der Rotation um die X-Achse braucht man i.A. alle 3 Parameter von 0 verschieden. Wenn die also schiefgeht, könnte das darauf hinweisen, dass die Winkel einfach nicht stimmen.

Keine passende Antwort gefunden?

Fragen Sie die Community