AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Vektordistanz Fadenkreuz zu Spieler (2D) berechnen
Thema durchsuchen
Ansicht
Themen-Optionen

Vektordistanz Fadenkreuz zu Spieler (2D) berechnen

Ein Thema von Zacherl · begonnen am 12. Aug 2011 · letzter Beitrag vom 13. Aug 2011
Antwort Antwort
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#1

AW: Vektordistanz Fadenkreuz zu Spieler (2D) berechnen

  Alt 13. Aug 2011, 03:38
Das ist effektiv das selbe wie mein Vorschlag Nur, dass man mit den Kugelkoordinaten vermutlich billiger davon kommt, da man pro Gegner nur zwei trigonometrische Funktionen und 4 einfache Fallunterscheidungen machen muss*, und schon hast du "delta yaw + pitch". Wichtig ist dabei eben, dass die Distanz weg fällt, da so ein Projektil ja mit unendlicher Geschwindigkeit recht gut angenähert ist

Wenn man die beiden Winkel hat, kann man wieder recht einfach mittels "sqrt(yaw²+pitch²)" den gesamten Abstand berechnen, da die Projektion auf die Kugel im Grunde wieder ein 2D-Raum ist. Allerdings kein euklidscher, man müsste diesen Abstand dann für ein paar Fälle anpassen, da man zwischen -180° und 180° so eine doofe Stelle hat - es beschreibt ja beides die selbe Richtung, ist aber in Zahlen gesprochen recht weit weg voneinander. Man müsste also hier und da mal ein Pi addieren bzw. abziehen, aber für wann und wo genau ist mir das jetzt auch zu spät

*) Und natürlich insgesamt ein Mal (pro Frame / Testdurchgang) für einen Punkt in Blickrichtung mit etwas Abstand zum Spieler.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (13. Aug 2011 um 03:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Vektordistanz Fadenkreuz zu Spieler (2D) berechnen

  Alt 13. Aug 2011, 04:28
Ich bedanke mich schonmal recht herzlich für deine Hilfe. Werde mich wohl morgen nochmal melden Ich probiere jetzt erstmal die Sache mit sqrt() anhand von meinen wohl umständlich berechneten Delta Pitch und Delta Yaw Werten aus und schaue, inwiefern ich da noch ein Paar Anpassen vornehmen muss.

Wenn das soweit funktioniert bin ich sehr gespannt, ob ich mit den Kugelkoordinaten noch eine Optimierung erreichen kann

Hier mal meine momentane Funktion zur Berechnung der Zielwinkel (absoluter Winkel / kein Delta):
Delphi-Quellcode:
procedure CalculateAimAngle(const Device: IDirect3DDevice9;
  Player: TPlayerListItem; var Pitch, Yaw: Single);
var
  Z, P, D, A: TD3DXVector3;
  T: Integer;
begin
  Z := CallNodeTransform(Device, Player, BONE_HEAD, false);
  P := Camera.Position;
  // Pitch berechnen
  D3DXVec3Subtract(D, Z, P);
  A.x := 0;
  A.y := 1;
  A.z := 0;
  D3DXVec3Normalize(D, D);
  Pitch := ArcSin(Abs(D.x * A.x + D.y * A.y + D.z * A.z));
  if ((Z.y - P.y) > 0) then Pitch := -Pitch;
  // Yaw berechnen
  D.x := Z.x - P.x;
  D.y := 0;
  D.z := Z.z - P.z;
  A.x := 0;
  A.y := 0;
  A.z := 1;
  D3DXVec3Normalize(D, D);
  Yaw := ArcCos(D.x * A.x + D.y * A.y + D.z * A.z);
  if ((Z.x - P.x) < 0) then Yaw := (2 * PI) - Yaw;
  // In Normalform umrechnen (Manchmal sind die Winkel Vielfache von 2*PI)
  T := Round(Yaw / (PI));
  if (T = 1) then
  begin
    Yaw := Yaw - (2 * PI);
  end else
  begin
    Yaw := Yaw - (PI * T);
  end;
end;
Denke mal, hier kann man noch einiges an Optimierungen durchführen
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Vektordistanz Fadenkreuz zu Spieler (2D) berechnen

  Alt 13. Aug 2011, 17:54
Das haut schonmal absolut nicht hin. Ich berechne erst den Winkel mit der oben geposteten Funktion und passe ihn dann an das aktuelle Vielfache von 2*PI an. Wenn man die Spielfigur paar Mal im Kreis bewegt, wird der Yaw Winkel nicht resettet, sondern erhöht sich einfach um eine komplette Umdrehung.

Zum anpassen des berechneten Winkels habe ich mir folgendes geschrieben:
Delphi-Quellcode:
procedure NormalizeAimAngle(var Pitch, Yaw: Single);
var
  T: Integer;
begin
  T := Round(Camera.Yaw / (PI));
  Yaw := Yaw + (PI * T);
  if (T mod 2) <> 0 then
  begin
    Yaw := Yaw + PI;
  end;
end;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Vektordistanz Fadenkreuz zu Spieler (2D) berechnen

  Alt 13. Aug 2011, 18:00
Meine Idee wäre, das Fadenkreuz als dreidimensionalen Strahl aufzufassen, der von der Kameraposition aus in die Blickrichtung verläuft. Der Abstand eines Spieler wäre dann der Abstand zu diesem Strahl. Ich wüsste jetzt aber auf die Schnelle nicht, wie man den Abstand eines Punktes von einem Strahl am einfachsten berechnet.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Vektordistanz Fadenkreuz zu Spieler (2D) berechnen

  Alt 13. Aug 2011, 18:33
Interessante Idee. Was die Berechnung angeht, stehe ich allerdings auch auf dem Schlauch. Die eigene Kameraposition und Rotation müsste ich ja dann auch erst noch in einem Richtungsvektor konvertieren, vermute ich.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Vektordistanz Fadenkreuz zu Spieler (2D) berechnen

  Alt 13. Aug 2011, 18:37
Wobei, wenn ich es mir recht überlege, bringt das, glaube ich, auch nicht das, was du eigentlich erreichen willst...
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Vektordistanz Fadenkreuz zu Spieler (2D) berechnen

  Alt 13. Aug 2011, 19:28
Namenlozer - ich schätze, hierbei geht es um Picking und deshalb ginge das doch gar nicht!?! Denn...

Wenn man überlegt, dass Spieler, die weiter entfernt sind zur Kamera, durch Verzerrung näher zu dieser Gerade gezeichnet werden, als jene, die tatsächlich der Geraden näher sind aber auch näher zur Kamera und somit weiter entfernt vom Fadenkreuz gezeichnet werden.
Mit dieser Methode könnte man die Entfernung OHNE Berücksichtigung der Tiefe ermitteln. Falls erwünscht, könnte ich mal versuchen, zu erklären, wie man dies berechnet?!

Tut zwar nicht viel zur Sache, aber...
Ich würde dir empfehlen, nicht alle Entities zu überprüfen, sondern nur jene hernehmen, die auch wirklich sichtbar sind - die im Frustum liegen und auch nicht verdeckt sind (Stichworte: Occlusion Queries, Octrees und Frustum Culling)!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz