Kranarm ausrichten: Vectorrechnung



  • Hallo.

    Ich habe mir in 3D(GLScene:Delphi) einen Kranarm gebastelt und in seiner Nähe ein Objekt platziert. Jetzt muss ich den Kranarm sowohl in dessen Richtung drehen, als auch gegebenenfalls den Kranarm anheben, damit der direkt über dem Objekt platziert ist.

    Ich habe das über Tangens etc bereits gelöst, das scheint mir aber nicht so wirklich der optimale Weg zu sein, da ich unter anderem if / else Abfragen einbauen muss, in welchem Quadranten sich das Objekt befindet.

    Daher würde ich hier gern mal fragen ob es auch anders geht.

    Gegeben sind:

    der Kranarm mit
    Position = Vector(X,Y,Z) (0, -5, 0)
    Direction = Koordinaten(X,Y,Z) (0, 0, 1) Diese können nur -1 bis 1 sein.
    Up = Koordinaten(X,Y,Z) (0, 1, 0) Diese können nur -1 bis 1 sein.
    Der Kranarm ist 25 lang.

    das Objekt mit
    Position = Vector(X,Y,Z) (10, 10, 2.5)
    Z interessiert in dem Falle nicht einmal

    Direction steht in engem Zusammenhang zu Up. Beides sind zwei Vektoren, deren Koordinaten zusammen nicht mehr als 1 oder nicht weniger als -1 ergeben. Direction bezeichnet die Orientierung des Objektes. Up ist die Richtung der Oberseite und steht senkrecht zu Direction (daher beeinflussen sich die Werte gegenseitig, wenn man sie ändert). Beide Vektoren geben den Bewegungsfunktionen Move und Lift die Strecke vor.

    Hat hier jemand eine Idee wie ich ausrechnen kann auf was ich Up und Direction setzen muss, damit die Kranspitze direkt über dem anderen Objekt liegt?



  • Kleine Ergänzung zu Direction und Up:

    http://glscene.sourceforge.net/wikka/RotateObjects schrieb:

    The Direction vector defines where the object is pointing at. By default the direction of an object is in the Z axis. The direction vector manages the TurnAngle of the object and the PitchAngle.

    The Up vector defines where “up” is. By default the Up vector is aligned with the Y axis. The Up vector manages the RollAngle and PitchAngle.


  • Mod

    Wenn ich dich recht verstehe, dann musst du das Gleichungssystem

    \vec {p\_K} + 25\vec{d} = \vec{p\_O} + h\vec{u}\\ |\vec{d}|=1\\ h \ge 0

    lösen. Wobei d\vec d deine gesuchte Direction ist, u\vec u ist deine (vorgegebene!) Up-Richtung, \vec {p_K} die Kran-Position und \vec{p_O} die Objektposition. Nebenbei fällt mit hh auch noch die Höhe ab, die dein Kran später über dem Objekt haben wird.

    Ich verstehe dein Vorhaben mit dem Drehen nicht. Musst du denn die Bewegung des Kranarmes berechnen? Der Rest deines Beitrags klingt so, als wolltest du einfach nur die Endposition wissen (Lösung dazu: Siehe oben). Ich bin daher gerade etwas verwirrt, was du wissen möchtest.



  • Der Kran ist kein Baukran, sondern eher soetwas in der Art: http://image.img-erento.com/autokran/autokran-50-to-autokran-2996231-23797127_gallery.jpg

    Er kann um sich selbst drehen und zusätzlich den Kranarm ankippen. Der Kranarm ist zum Beispiel hier 25 lang, aber das Objekt steht nur 20 entfernt. Also muss er den Kranarm ankippen, damit dessen Spitze über dem Objekt steht.

    Ich möchte wie du richtig erkannt hast gern Direction und Up ermitteln, damit sich der Kranarmspitze sich direkt über das Objekt platziert.

    Wenn das funktioniert, würde ich gern das ganze natürlich animieren. Wie er aus der Ausgangsposition zur Zielposition sich bewegt. Ich weiß aber noch nicht wie man das bewerkstelligt. 🤡


  • Mod

    ~Tex schrieb:

    Wenn das funktioniert, würde ich gern das ganze natürlich animieren. Wie er aus der Ausgangsposition zur Zielposition sich bewegt. Ich weiß aber noch nicht wie man das bewerkstelligt. 🤡

    Na, dann machen wir lieber gleich eine "grafische" Lösung obiger Gleichungen. Dafür war der Tangens schon voll in Ordnung, du kennst wohl nur noch nicht atan2. Damit drehst du den Kran erst in die richtige Richtung (in der Horizontalen, also senkrecht zur up-Richtung) und hebst oder senkst dann den Arm (d.h. du veränderst den Winkel zwischen "Direction" und up-Achse) nach Bedarf. Du kannst natürlich auch beide Bewegungen gleichzeitig ausführen.



  • Ich stehe vermutlich momentan total auf dem Schlauch, weil ich mich zu lang jetzt schon damit befasse und festgebissen habe. Ich verstehe nicht ganz was du mit "grafische" Lösung obiger Gleichungen meinst.

    Also die Ausrichtung habe ich vormals so gelöst:

    KranGelenk.RollAngle := -(90 - RadToDeg(ArcTan((KranGelenk.Position.X - Box.Position.X) / (Box.Position.Y - KranGelenk.Position.Y))))
    

    Das gilt aber nur wenn die Box rechts vom Kranarm steht. Daher meinte ich eine allgemeine Lösung schöner wäre, welche immer funktioniert. Den TurnAngle (also das Ankippen) hätte ich dann ähnlich gelöst. Weiterhin den Winkel auf diese Weise bestimmen oder deine Gleichung dafür verwenden oder gar was anderes?

    Wie animiert man denn etwas auf eine fixe Position? Man hat einen Ausgangswert und ein Zielwert. Teile ich das durch eine Schrittweite, sagen wir der Kran kann maximal 10° pro Sekunde sich drehen, wie bestimme ich da den exakten Stopwert beim Cadencer?

    In meinem Fall habe ich einen so genannten Cadencer:

    procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime,
      newTime: Double);
    begin
        KranGelenk.Roll(deltaTime*10);
    end;
    

    Das würde zum Beispiel 10° pro Sekunde drehen bzw 10° * deltatime. Aber wie schaffe ich es jetzt das er gleichförmig sich auf exakt meine Zielposition dreht und dann dort stoppt? (Anhalten geht generell über GLCadencer1.Enabled := false;)

    ich gehe erstmal schlafen. ^^


Anmelden zum Antworten