Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

1

03.07.2016, 19:40

Flugpfad berechnen

Hi,
bei einem Spiel, soll ein Flugzeug um den Cursor kreisen. Wenn der Cursor bewegt wird, sollte das Flugzeug noch um den Cursor fliegen, aber auf einem realistisch aussehenden Pfad, wie in ein Flugzeug fliegen würde. Also keine Drehung auf einer Position, etc..

Gibt es da evtl. ein Standard Verfahren für solche Pfade?



Schönen Sonntag wünscht,
MitgliedXYZ

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

03.07.2016, 20:12

Zitat

realistisch aussehenden Pfad, wie in ein Flugzeug fliegen würde

Kannst du das ein wenig konkreter beschreiben?

Dein Bild sieht ehrlich gesagt nicht sehr realistisch aus. Ich würde annehmen, dass in der Realität würde das Flugzeug auf einer Kreisbahn um einen Punkt kreisen würde. Das sollte man relativ einfach hinbekommen können, in dem man das Flugzeug immer in die Richtung des Punktes lenkt. Mit einem bestimmten minimalen Kurvenradius und maximaler Lenkgeschwindigkeit.

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

3

04.07.2016, 15:42

Das ist garnicht so kompliziert! Ich mache mal einen Lösungsvorschlag mit Skizze (Anhang):

Gegeben ist:
  • Mausposition §M§
  • Flugzeugposition §F§
  • Flugkreisradius §r§
  • Maximaler Querrudereinschlag §\alpha_{max}§
Gesucht ist:
  • Querrudereinschlag §\alpha§
Zuerst musst du die Punkte §Z_1§ und §Z_2§ herausfinden. Dazu verwendest du den Satz des Thales (Such dort nach: "2. Konstruktuktion von Tangenten an einen Kreis, die durch einen außerhalb des Kreises liegenden Punkte verlaufen sollen."). Du schneidest dazu zwei Kreise:
  1. Mittelpunkt ist §M§ und der Radius ist §r§
  2. Mittelpunkt ist die Mitte der Strecke §\overline{MF}§ und Kreispunkt §M§
Als Lösung bekommst du dann die beiden Punkte §Z_1§ und §Z_2§ heraus. Verbunden mit §F§ hast du die beiden Tangenten, die das Flugzeug abfliegen kann um zum Flugkreis zu kommen. Nun berechnest du, welche Tangente den kleineren Lenkeinschlag (§\alpha_1§ oder §\alpha_2§) benötigt. Das geht mit dem Skalarprodukt.

Als letzten Schritt musst du prüfen, ob der Soll-Lenkeinschlag kleiner gleich dem Maximalen ist. Falls ja nimmst du ihn direkt und falls nein, nimmst du den maximalen Lenkeinschlag.

Wie sich das Flugzeug verhält, wenn es sich auf der Kreisbahn befindet weiß ich nicht, kann sein, dass es wackelt. Du kannst ja einen minimalen Lenkeinschlag festlegen, unter dem nicht gelenkt wird. Ansonsten sollte das funktionieren. :)
»CeDoMain« hat folgendes Bild angehängt:
  • Skizze.png
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

4

04.07.2016, 20:26

Danke für deinen Algorithmus CeDoMain

Habe mal versucht mit Processing.js einen Prototypen zu entwickeln
Code: http://pastebin.com/5dKwUaWy
Editor: http://js.do/blog/processing/editor/

Momentan bin ich aber noch am rätseln, welchen Rechenfehler ich bei den Tangenten Punkten mache. Hat da jemand eine Idee, warum die so entfernt sind?

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

5

05.07.2016, 00:33

Habe deinen Code mal korrigiert. Konnte vorher kein Processing... jetzt kann ichs (ein bisschen). :)

Vergleich einfach mal deinen mit meinem Code. Ich habe keine Codezeilen hinzugefügt, sondern nur abgeändert.

Ich vermute stark, dass du an der Namensgebung gescheitert bist. Das bin ich nämlich auch. Deine Namen sind nicht eindeutig verständlich. Sowas wie KreismitteX oder MouseX kann keiner gebrauchen. Mach dir ganz oben eine Definition hin, wo MouseX als P0X, KreismitteX als P1X definiert wird und so weiter. Gerade wenn du eine Anleitung von irgendwoher verfolgst und dort andere Namen verwendet werden kommt man doch völlig durcheinander!? Es hat ne halbe Stunde gedauert, bis ich erkannt habe, dass du PlaneX mit kreisMitteX verwechselst. Vorzeichenfehler passieren dann auch nicht mehr, weil man bei gleichen Namen viel schneller die Rechenzeichen überprüfen kann.

Schau dir den Befehl ellipse nochmal an. Der erwartet den Mittelpunkt und die Durchmesser. Wenn du Letztere mit kreisRadius - (kreisRadius / 2) berechnen willst kann das ja garnicht funktionieren! ;) Und das hier: getDistance(mouseX, mouseY, planeX, planeY) * 2 gibt dir übrigens den doppelten Durchmesser zurück und nicht den Radius. Kleine, aber fatale Fehler! ;)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
int planeX, planeY;
int radius;
 
void setup() {
  size(640, 400);
 
  planeX = 500;
  planeY = 200;
 
  radius = 100;
}
 
void draw() {
  background(150, 150, 220);
 
  noFill();
 
  rectMode(CENTER);
 
  //Kreis um mouse und plane berechnen
  int kreisRadius = getDistance(mouseX, mouseY, planeX, planeY) / 2;
  int kreisMitteX = (mouseX + planeX) / 2;
  int kreisMitteY = (mouseY + planeY) / 2;  
 
  ellipse(kreisMitteX, kreisMitteY, kreisRadius * 2, kreisRadius * 2);
 
  ellipse(mouseX, mouseY, radius * 2, radius * 2);
 
  //Punkte z1 und z2 berechnen
  //http://stackoverflow.com/questions/3349125/circle-circle-intersection-points
  int d = getDistance(kreisMitteX, kreisMitteY, mouseX, mouseY);
  int a = (pow(radius, 2) - pow(kreisRadius, 2) + pow(d, 2)) / (2 * d);
 
  int p2x = mouseX + a * (kreisMitteX - mouseX) / d;
  int p2y = mouseY + a * (kreisMitteY - mouseY) / d;
  
  ellipse(p2x, p2y, 10, 10);
 
  int h = sqrt(pow(radius, 2) - pow(a, 2));
 
  int z1x = p2x + h * (mouseY - kreisMitteY) / d;
  int z1y = p2y - h * (mouseX - kreisMitteX) / d;
 
  int z2x = p2x - h * (mouseY - kreisMitteY) / d;
  int z2y = p2y + h * (mouseX - kreisMitteX) / d;
 
  ellipse(z1x, z1y, 10, 10);
 
  ellipse(z2x, z2y, 10, 10);
 
  fill(255, 255, 255);
 
  ellipse(mouseX, mouseY, 20, 20);
 
  rect(planeX,  planeY,  20,  20);
}
 
int getDistance(int x1, int y1, int x2, int y2) {
  return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
}
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

6

05.07.2016, 18:33

Danke fürs ausbessern ^^
Ich werde versuchen die Variablen besser zu benennen.

Hab etwas weiter geschrieben, das Flugzeug kann zum Cursor fliegen und ihn umkreisen.
Werde den Code noch weiter verbessern, z.b. dass sobald das Flugzeug den Radius erreicht hat, die Umdrehung nicht an der selben Position beginnt, sondern an der aktuellen. Also den Winkel zwischen dem Cursor und Flugzeug mit einer senkrechten Gerade berechnen.

Quellcode: http://pastebin.com/YX931HjN


CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

7

05.07.2016, 21:15

Du darfst in deinem Code nicht unterscheiden, ob das Flugzeug im Umkreis des Cursors ist oder nicht! Damit machst du doch die gleichmäßige Flugkurve kaputt. Du programmierst das so, dass das Flugzeug immer diese Tangentenpunkte anpeilt - auch wenn die direkt vor ihm liegen. Falls der Punkt direkt unter dem Flugzeug ist, kannst du ja festlegen, dass das Flugzeug geradeaus fliegt. Probiers mal aus!
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

8

06.07.2016, 18:39

Damit sieht die Flugkurve schon besser aus. Allerdings bleibt das Flugzeug manchmal hängen, bzw. verschwindet aus dem Bildschirm, wenn der Cursor nicht bewegt wird. Ich werde den Code bei Gelegenheit noch verbessern.


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

06.07.2016, 20:32

Hast du dir mal Steering Behaviors angesehen? Nach dem Vorbild könnte man das an sich auch angehen. Dein Flugzeug möchte einerseits vorwärts kommen und andererseits den Abstand zum Mittelpunkt einhalten. Interessant wird es weil das ganze auf Kräften basiert. Ein echtes Flugzeug kann normalerweise nicht von jetzt auf gleich die Flugrichtung um 180° ändern. Die Trägheit sorgt dafür dass es weiter in die aktuelle Richtung gedrängt wird. Du gibst jetzt passend Kraft hinzu um den Kurs des Flugzeugs anzupassen, hast aber keine hektischen Änderungen dadurch drin. Kannst ja einfach mal nach dem Stichwort suchen. Das sollte schon weiter helfen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

10

07.07.2016, 18:58

Das ist ein interessantes Konzept. Ich werde bei Gelegenheit einen Prototypen mit der Funktionsweise entwickeln.

Werbeanzeige