Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 10:07

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Aug 17, 2018 07:27 
Offline
DGL Member

Registriert: Mi Jul 11, 2018 17:32
Beiträge: 10
Programmiersprache: C++
Hey,
wie bekomme ich es hin, das der Winkel zwischen zwei Vektoren von 0 - 360 geht?
Ich versuche gerade eine Kollision zu realisieren.
Ich habe einen Baum und einen Character und möchte mit Hilfe des Winkels herausfinden ob der Character links,rechts, vor oder hinter dem Baum steht.
Von 0-180 funktioniert alles sehr gut, das reicht aber leider nicht.
Code:
  1.  
  2. Vector tree = treePos[0];
  3. Vector distanceVec = position - tree;
  4. float dot = front.X * distanceVec.X + front.Z * distanceVec.Z;
  5. float lenghtF = sqrt(pow(front.X, 2) + pow(front.Z, 2));
  6. float lenghtT = sqrt(pow(distanceVec.X, 2) + pow(distanceVec.Z, 2));
  7. float angle = acos(dot/(lenghtF * lenghtT)) * 180/M_PI;
  8.  

Hab gelesen das man die atan2(...) nutzen sollte, habe da aber auch kein richtiges Ergebnis bekommen.
Könnte aber auch sein das ich es falsch angewendet habe.
Hoffe das mir jemand helfen kann :wink:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Aug 17, 2018 17:11 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Sehe ich es richtig, das der Baum und der Charakter je ein Kreis darstellt ?

Zitat:
links,rechts, vor oder hinter dem Baum steht.
Findest du die nicht mit den Mittelpunkte heraus ?

Zitat:
Ich versuche gerade eine Kollision zu realisieren.
Ich habe da mal eine kleinen Demo mit Kriesen, welche sich nicht überschneiden dürfen.
Vielleicht hilft dir dies weiter, obwohl es in Pascal ist.
Die Kreise, die sich gerade berühren werden rot.
http://www.lazarusforum.de/viewtopic.ph ... on#p103123


Dateianhänge:
Bildschirmfoto vom 2018-04-18 18-31-31.png
Bildschirmfoto vom 2018-04-18 18-31-31.png [ 7.92 KiB | 14259-mal betrachtet ]

_________________
OpenGL
Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Aug 19, 2018 22:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Hallo Amnesia,
in deinem Codebeispiel bestimmst du den Cosinus des gesuchten Winkels und versuchst dann, den Winkel mit acos() herbeizuzaubern. Das geht aus folgendem Grund schief:

Wenn du sin() und cos() kennst, hast du vielleicht auch schon mal vom Einheitskreis gehört. Das ist ein Kreis mit dem Radius 1.0, der im Koordinantenursprung liegt und der Veranschaulichung von sin() und cos() dient. Alle Punkte des Einheitskreises haben die x-Koordinate cos(winkel). Wie du aber auf dem Bild bei Wikipedia sehen kannst, gibt es immer zwei Punkte, die den gleichen x-Wert haben: einen oberen und einen unteren. Der acos()-Funktion gibst du nur deinen x-Wert. Deshalb ist es für acos() unmöglich herauszufinden, welchen der beiden möglichen Winkel du jetzt meinst. Deswegen gibt dir acos() einfach immer einen Winkel zwischen 0 und Pi (bzw. 0° und 180°) aus. Die atan2()-Funktion verlangt auch den y-Wert (den Sinus des Winkels) und kann daher alle WInkel von -Pi bis +Pi sicher bestimmen.

Woher bekommst du aber nun den Sinus des Winkels? Nun, praktischerweise gibt es da einen Zusammenhang mit dem Kreuzprodukt:
Code:
  1. Seien A und B zwei Vektoren.
  2. length(cross(A, B)) == length(A) * length(B) * sin(winkel_zwischen_A_und_B)
length() berechnet die Länge eines Vektors und cross() das Kreuzprodukt (wie in GLSL oder mit glm).

Die Gleichung kannst du dir ganz leicht umstellen, um den Sinus auszurechnen.

PS: Verwende lieber x*x statt pow(x, 2). pow() ist ziemlich langsam.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 20, 2018 15:14 
Offline
DGL Member

Registriert: Mi Jul 11, 2018 17:32
Beiträge: 10
Programmiersprache: C++
Danke für eure Hilfe!
Mit dem Mittelpunkt kann ich leider nicht herausfinden ob die Kamera in Richtung des Baums schaut.
@glAwesome
Tolle Erklärung, danke! Habe geschafft damit das Problem zu lösen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 20, 2018 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Mit dem Mittelpunkt kann ich leider nicht herausfinden ob die Kamera in Richtung des Baums schaut.

Der Mittelpunkt müsste doch ersichtlich sein. Wen du Matrizen multipliziert hast, hast du bei der Matrix[3, 2], den Translatepunkt bei der Z-Achse.

Wieso brauchst du die Kamera bei einer Kollisionsabfrage ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 20, 2018 21:45 
Offline
DGL Member

Registriert: Mi Jul 11, 2018 17:32
Beiträge: 10
Programmiersprache: C++
So überprüfe ich in welche Richtung ich mich bewegen kann.
Wenn die Distanz zu klein ist und die Kamera auf den Baum zeigt, also der Winkel 0 grad hat, darf ich mich nicht nach vorne bewegen.
90 grad nicht nach links, 180 nicht zurück und 270 nicht nach rechts.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 21, 2018 15:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Du willst dich wie in einem Ego-Shooter bewegen ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 22, 2018 18:13 
Offline
DGL Member

Registriert: Mi Jul 11, 2018 17:32
Beiträge: 10
Programmiersprache: C++
Genau, hätte ich vielleicht erwähnen sollen :D


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 22, 2018 18:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich hatte auch mal was ähnliches gemacht, so wie das alte Wolfenstein, welches alles aus Würfeln bestanden ist.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.073s | 19 Queries | GZIP : On ]