Ich habe ein 3D-Modell eines Turms, der sich um die Y-Achse dreht. Dieser Turm hat eine Kanone, die sich deutlich außerhalb der Mitte des Objekts befindet. Ich möchte, dass die Kanone und nicht der Turm auf ein bestimmtes Ziel zielen. Ich kann den Turm jedoch nur drehen und weiß daher nicht, welche Gleichung ich anwenden muss, um das Ziel zu erreichen.
Das folgende Bild zeigt mein Problem:
Wenn ich den Revolver "LookAt ()" als Ziel habe, wird ein von der Kanone stammender Laser dieses Ziel vollständig verfehlen.
Wenn dies ein vollständig von oben nach unten gerichtetes Szenario wäre und die Kanone genau parallel zum Turm wäre, dann sagt mir meine Logik, dass sich das gefälschte Ziel an einer Position befinden sollte, die dem tatsächlichen Ziel entspricht, zuzüglich eines Versatzes, der dem zwischen den beiden entspricht Turm und die Kanone. In meinem aktuellen Szenario ist meine Kamera jedoch um 60 ° abgewinkelt, und die Kanone hat eine leichte Drehung.
Das folgende Bild zeigt das Szenario:
Ich weiß nicht genau warum, aber wenn ich denselben Versatz anwende, scheint er nur zu funktionieren, wenn ich auf bestimmte Abstände vom Turm ziele.
Ist meine Logik fehlerhaft? Fehlt mir hier etwas Grundsätzliches?
Final Edit: Die Lösung des neuesten Updates von @JohnHamilton löst dieses Problem mit höchster Präzision. Ich habe jetzt den Code und die Bilder entfernt, die ich zur Veranschaulichung meiner falschen Implementierungen verwendet habe.
quelle
Antworten:
Die Antwort ist eigentlich ziemlich einfach, wenn Sie rechnen. Sie haben einen festen Abstand von Y und einen variablen Abstand von X (siehe Bild 1). Sie müssen den Winkel zwischen Z und X herausfinden und Ihren Revolver noch mehr drehen.
Schritt 1 - Ermitteln Sie den Abstand zwischen der Revolverlinie (V) und der Kanonenlinie (W), der Y ist (dies ist konstant, schadet aber nicht bei der Berechnung). Ermitteln Sie die Entfernung vom Turm zum Ziel (X).
Schritt 2 - Teilen Sie Y durch X und erhalten Sie dann den Hyperbelsinus des Werts
Schritt 3 - Drehen Sie den Turm noch weiter (um die Achse, die von oben nach unten verläuft, höchstwahrscheinlich um die obere Achse, aber nur Sie können diesen Teil erkennen).
In diesem Fall muss es natürlich gegen den Uhrzeigersinn gedreht werden, sodass möglicherweise ein Minus vor dem Drehwinkel hinzugefügt werden muss, wie in
-turnAngle
.Einige Teile bearbeitet. Vielen Dank an @ens für den Hinweis auf den Unterschied in der Entfernung.
Der OP sagte, seine Waffe hat einen Winkel, also gehen wir, Bild zuerst, Erklärung später:
Wir wissen bereits aus der vorherigen Berechnung, wohin die rote Linie mit der blauen Linie ausgerichtet werden soll. Also zuerst auf die blaue Linie zielen:
Die einzige Berechnung, die sich hier unterscheidet, ist die Berechnung von "X Prime" (X '), da der Winkel zwischen der Waffe und dem Turm (Winkel "a") den Abstand zwischen den Linien verändert hat.
Dieser nächste Teil ist NUR erforderlich, wenn Sie die Revolverpistolen modular ausführen (dh der Benutzer kann die Pistolen auf einem Revolver wechseln und verschiedene Pistolen haben unterschiedliche Winkel). Wenn Sie dies im Editor tun, können Sie bereits sehen, welcher Schusswinkel dem Turm entspricht.
Es gibt zwei Methoden zum Ermitteln des Winkels "a", eine Methode ist die transform.up-Methode:
Die obige Technik wird in 3D berechnet. Wenn Sie also ein 2D-Ergebnis erhalten möchten, müssen Sie die Z-Achse entfernen (ich gehe davon aus, dass dort, wo sich die Schwerkraft befindet, aber wenn Sie nichts geändert haben, ist in Unity die Y-Achse nach oben oder unten gerichtet). Das heißt, die Schwerkraft liegt auf der Y-Achse.
Der zweite Weg ist die Rotationsmethode (ich denke in diesem Fall in 2D):
Alle diese Codes geben Ihnen wiederum positive Werte, so dass Sie möglicherweise den Betrag abhängig vom Winkel addieren oder subtrahieren müssen (es gibt auch Berechnungen dafür, aber ich werde nicht weiter darauf eingehen). Ein guter Ausgangspunkt hierfür wäre die
Vector2.Dot
Methode in Unity.Letzter Codeblock für zusätzliche Erklärungen:
Wenn du alles richtig gemacht hast, solltest du eine Szene wie diese bekommen ( Link für das Unitypackage ): Was ich mit immer positiven Werten meine:
Die Z-Methode kann negative Werte liefern:
Für eine Beispielszene erhalten Sie das Unity-Paket über diesen Link .
Hier ist der Code, den ich in der Szene verwendet habe (auf dem Turm):
3D-angepasster Code mit X und Z als 2D-Ebene:
quelle
Sie können auch einen allgemeineren Ansatz verwenden:
Die Mathematik für Ihr Problem existiert bereits in Form des Skalarprodukts (oder Punktprodukts) . Sie müssen nur die Richtung Ihrer Waffen-Vorwärtsachse und die Richtung von Ihrer Waffe zum Ziel ermitteln.
Sei W der Vorwärtsvektor deiner Waffe.
Lass D die Richtung von deiner Waffe zu deinem Ziel sein. (Target.pos - Weapon.pos)
Wenn Sie die Formel des Skalarprodukts lösen
Für Alpha erhalten Sie:
Sie müssen nur das Bogenmaß in Grad umrechnen und haben Ihren Winkel, um Ihren Roboter zu drehen. (Wie Sie bereits erwähnt haben, befindet sich die Waffe in einem Winkel zu Ihrem Roboter. Daher müssen Sie den Winkel zu Alpha hinzufügen.)
quelle
Alle bisher veröffentlichten Antworten sind (mehr oder weniger) falsch, daher hier eine schnelle, korrekte Lösung:
Um die Waffe auf das Ziel zu richten, drehen Sie den Turmvektor vorwärts zum Ziel und addieren Sie den Winkel θ.
Also lasst uns θ finden:
Wenn sich
δ' = 0
dies vereinfachtθ = asin(a / d)
, entspricht das dem ersten Teil von John Hamiltons Antwort.Bearbeiten:
Ich habe ein funktionierendes Beispiel hinzugefügt.
Öffnen Sie in JSFiddle oder verwenden Sie das folgende eingebettete Snippet:
quelle