Brainstorming: Physik beim Drohnenflug und dessen Implementierung..

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..

Beitrag von corpsman »

Sodale,

Also das ich meine Beschleunigung für den Luftwiderstand normieren muss das ist mir heute Nacht auch aufgefallen. Die Umbenennung in Acceleration habe ich mangels meiner Physikkenntnisse nicht gemacht :roll: .

Ich Berechne den Luftwiderstand aus der gesammten Beschleunigung und nicht nur aus dem Teil der Hinzu kommt, deswegen erst nach dem Addieren der Acceleration.
Da fVelocity ja bereits durch fMass geteilt ist, macht es dann auch Sinn beim Luftwiderstand nicht noch mal durch fMass zu Teilen und damit Lande ich dann bei:

Code: Alles auswählen

Procedure TDrone.Move(Delta: Integer);
Const
  cw: Single = 0.45; // Empirisch ermittelt
  A: Single = 0.3 * 0.3; // Ungefähre Fläche einer 30cm*30cm großen Drohne
Var
  aspeed, d, p: TVector3;
Begin
  If Not assigned(Input) Then exit;
  fThrottle := (4 * fMotorForce) / fMass; // 4 * Motoren Pro Drohne also 4-Fache Kraft
  fTotalAcceleration := v3(0, 0, 0);
  Case fFlightMode Of
    fmAcro: MoveAcro(Delta);
    fmArcade: MoveArcade(Delta);
  End;
  fVelocity := fVelocity + fTotalAcceleration * (Delta / 1000);
  p := fCam.Position;
  // Luftwiderstand
  d := cw * A * 0.5 * DotV3(fVelocity, fVelocity) * normv3(fVelocity);
  fVelocity := fVelocity - d;
  aspeed := fVelocity * 1000 / delta;
  form1.caption := format('%0.2f / %0.2f / %0.2f = %0.2f', [aspeed.x, aspeed.y, aspeed.z, LenV3(aspeed)]);
  p := p + fVelocity;
  fcam.Position := p;
  // Kollisionen ..
  If assigned(Map) Then Begin
    If fCam.CollideWithGround(map.GetHeightAtPosition(p.x, p.z)) Then Begin
      fVelocity := v3(0, 0, 0);
    End;
  End;
End; 
Mittels des Luftwiderstandes kann ich nun die Maximale Geschwindigkeit der Drohne beeinflussen, mittels der Masse die Trägheit.
cw=0.45, fMass = 100, fMotorForce =2000 => eine Maximal Geschwindigkeit von ca. 45 Längeneinheiten Pro Sekunde
cw=0.05, fMass = 100, fMotorForce =2000 => eine Maximal Geschwindigkeit von ca. 135 Längeneinheiten Pro Sekunde
cw=0.05, fMass = 400, fMotorForce =2000 => eine Maximal Geschwindigkeit von ca. 25 Längeneinheiten Pro Sekunde

Damit habe ich nun 2 Werte mit denen ich das Verhalten an die Szenerie anpassen kann, Masse und Motorkraft für die Agilität und cw für die Begrenzung der Geschwindigkeit.
In Summe fliegt sich das ganze so eigentlich Recht angenehm ;)

[Edit]
Die Renderqualität habe ich nun auch ein klein wenig verbessert:
vorschau3.jpg
vorschau3.jpg (47.95 KiB) 1044 mal betrachtet
Als nächstes baue ich mal Licht und Schatten ein ;)
--
Just try it

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..

Beitrag von kupferstecher »

Habe gerade erst deinen Beitrag von gestern gesehen. Ja, man kann natürlich auch die Geschwindigkeitsänderung für jede Kraftkomponente getrennt berechnen, ist ja eine einfache Überlagerung. Ich denke der intuitivere Weg wäre schon, zunächst alle Kräfte zusammenzufassen.

Antworten