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

Aktuelle Zeit: Di Jul 15, 2025 17:23

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Vektoren bei der Animation
BeitragVerfasst: Do Apr 10, 2008 13:07 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
Hi,
Ich bin vor kurzem über einen Algorithmus gestoßen, der den Weg eines Objektes so ändert, dass es nicht mit den anderen Objekten in der Umgebung zusammenstößt. Dazu wurden im Kern einfach die gesamten Vektoren der Objekte addiert um so den neuen Zielvektor zu berechnen. Ich hab mir dann ein wenig Beispielcode gesucht und erkannte dabei, dass die meisten Objekte auf irgendwelchen Vektorklassen basierten.
Bisher habe ich meine Objekte immer so aufgebaut (zur Vereinfachung erstmal 2D), dass ich ihnen die Eigenschaft XPos/YPos/Speed/Winkel gegeben habe und daraus dann immer die neuen Position berechnet habe. Im Prinzip gleicht sich das ja zum Teil.
Nun meine Frage: Ist es sinnvoller mit Vektoren zu rechnen oder ist das schon gänig so wie ich das Thema angegangen bin?
Wenn Vektoren besser sind: Wie implementiere ich die Geschickt? Ich wollte eigentlich keine vorgefertigte Vektorklasse nehmen,sondern das wenn selber programmieren. Aber dafür habe ich gerade irgendwie keinen Ansatz.

Danke!

P.S. Hab mich noch nicht viel mit Vektoren beschäftigt, hab heute morgen den Wikipedia und ein paar andere Artikel im Internet durchgearbeitet, aber in der Schule hatte ich das Thema z.B. noch nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 10, 2008 14:23 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Das was du mit XPos und YPos gemacht hast ist (wenn mans nicht so genau nimmt) eigentlich ein Vektor, zwar nur ein 2-dimensionaler, aber immerhin ein Vektor.

z.b.
Code:
  1.  
  2. type
  3.   TVector2f : record
  4.     x, y : single;
  5.   end;
  6.  


wobei Vector.X deinem XPos und Vector.Y deinem YPos entspricht.

dreidimensional dann etwa so:

Code:
  1.  
  2. type
  3.   TVector3f : record
  4.     x, y, z : single;
  5.   end;
  6.  


und mal ein Beipielobjekt:

Code:
  1.  
  2. type
  3.   TObjectRec = record
  4.     Position,
  5.     Speed,
  6.     Rotation : TVector3f;
  7.   end;
  8.  


Zusätzlich brauchst du noch ein paar Funktionen um mit den Vektoren zu rechnen. Addieren, subtrahieren, etc... Findest du hier

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 10, 2008 15:18 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
Ja sowas dachte ich mir auch - ich habe ja eigentlich schon einen Vektor umgesetzt. Nun ist die Addition etc. ja auch nicht sonderlich schwer. Nur was ich komisch, bzw. fraglich finde ist die Tatsache, dass in den meisten Beispielquellcodes der Winkel nicht zum Tragen kommt und die Geschwindigkeit ebenfalls als Vektor aufgefasst wird.
Ich brauche in meinem Programm keinen 2. Vektor für die Geschwindigkeit, da sich die nächste Position ja eindeutig mit Winkelfunktionen (sind/cos) aus dem gegebenen Winkel und der Geschwindigkeit berechnen lässt.
Das bringt mich halt zum dem Problem, dass der Algo. nicht mehr richtig funktioniert. Habe ich da nun was falsch verstanden oder den Algo. einfach falsch implementiert?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 10, 2008 15:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Du hast bei 2D im prinzip das Ergebnis deiner sin/cos operationen im Vektor gespeichert (meist normalisiert). Wenn du dann die neue Position berechnest, multiplizierst du den Richtungsvektor mit der Geschwindigkeit (verlängerst ihn also) und addierst das auf den Positionsvektor.

Richtungsänderungen führst du durch, indem du den Vektor drehst, z.B. mit Sin/Cos oder einer Matrix (die aber letzendlich auch mit sinus und cosinus gebildet wird).

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 10, 2008 15:31 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
Das ist doch eigentlich das, was ich die ganze Zeit über mache oder irre ich jetzt total? Ich berechne ja auch die neue Position mit dem Winkel und der Geschwindigkeit und addiere diese dann auf meine derzeitige


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 10, 2008 16:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Das ist doch eigentlich das, was ich die ganze Zeit über mache oder irre ich jetzt total?

JA (also, ich meine Du irrst Dich nicht). Grade bei der Vektorrechnung ist Mathematik und der übliche "gesunde Menschenverstand" nicht weit voneinander weg. Leider ist das nicht immer so :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 10, 2008 16:29 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Ich denke schon. Nur dass du für die Komponenten der Koordinaten einzelne Variablen hast.

Prinzipiell macht z.b. mein Camera Objekt nix anderes...

Aus Tasteneingaben Bewegungsvektor (z.b. (0, 0, -1) entlang Z-Achse/vorwärts ) bilden.
Diesen Vektor um Winkel entsprechend der Mausposition drehen.
Vektor mit Zeit pro Frame multiplizieren.
Vektor mit Geschwindigkeit multiplizieren.
Vektor auf Position addieren.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 10, 2008 17:38 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
Joa, wobei das bringt mich zu einem anderen Problem. Gehen wir davon aus, alles sei korrekt implementiert, dann habe ich ein Problem in einem anderen Algo. Ich bin gerade dabei eine eigene Version von Boids schreiben. Hier gibts den Pseudocode für das Programm: http://www.vergenet.net/~conrad/boids/pseudocode.html
Meine Version der drei Regeln schaut nun so aus(in java)
Code:
  1.     //otherBoids ist ein array, welches alle Boids enthält
  2. private double[] calcSeperation()
  3.     {
  4.         double pos[] = {0,0};
  5.        
  6.         for (int i = 0; i < otherBoids.length; i++)
  7.         {
  8.             if (otherBoids[i] != null)
  9.             {
  10.                 if (this == otherBoids[i]) continue;
  11.                                 // schauen welche Boids im Bereich sind
  12.                 if (calcDistance(otherBoids[i]) < getRadius())
  13.                 {
  14.                     pos[0] = pos[0] + otherBoids[i].calcNextXPos(); //calcNextPos berechnet die nächste Position des Boid
  15.                     pos[1] = pos[1] + otherBoids[i].calcNextYPos();
  16.                 }
  17.             }
  18.         }
  19.  
  20.         pos[0] = pos[0]*SEPERATION; //Konstante für die Gewichtung
  21.         pos[1] = pos[1]*SEPERATION;
  22.        
  23.         return pos;
  24.     }
  25.    
  26.     private double[] calcCohesion()
  27.     {
  28.         double pos[] = {0,0};
  29.         int boidCnt = 0;
  30.        
  31.         for (int i = 0; i < otherBoids.length; i++)
  32.         {
  33.             if (otherBoids[i] != null)
  34.             {
  35.                 if (this == otherBoids[i]) continue;
  36.                 if (calcDistance(otherBoids[i]) < getRadius())
  37.                 {
  38.                     pos[0] = pos[0] + otherBoids[i].calcNextXPos();
  39.                     pos[1] = pos[1] + otherBoids[i].calcNextYPos();
  40.                     boidCnt++;
  41.                 }
  42.             }
  43.         }
  44.        
  45.         if (boidCnt != 0)pos[0] = (pos[0]*COHESION)/boidCnt;
  46.         if (boidCnt != 0)pos[1] = (pos[1]*COHESION)/boidCnt;
  47.        
  48.         return pos;
  49.     }
  50.    
  51.     private double calcAligment()
  52.     {
  53.         double speed = 0;
  54.         int boidCnt = 0;
  55.        
  56.         for (int i = 0; i < otherBoids.length; i++)
  57.         {
  58.             if (otherBoids[i] != null)
  59.             {
  60.                 if (this == otherBoids[i]) continue;
  61.                 if (calcDistance(otherBoids[i]) > getRadius())
  62.                 {
  63.                     speed = speed + otherBoids[i].getSpeed();
  64.                     boidCnt++;
  65.                 }
  66.             }
  67.         }
  68.        
  69.         if (boidCnt == 0) speed = getSpeed();
  70.         else speed = speed/boidCnt;
  71.        
  72.         return speed;
  73.     }
  74.    
  75.     private void boidRules()
  76.     {
  77.         double XPos = 0;
  78.         double YPos = 0;
  79.         double pos[] = {0,0};
  80.        
  81.         pos = calcCohesion();
  82.         XPos = XPos + pos[0];
  83.         YPos = YPos + pos[1];
  84.        
  85.         pos = calcSeperation();
  86.         XPos = XPos + pos[0];
  87.         YPos = YPos + pos[1];
  88.        
  89.         setSpeed(calcAligment());
  90.        
  91.         if (XPos != 0 || YPos != 0) setAngle(Math.toDegrees((Math.atan(Math.abs(YPos - getYPos())/Math.abs(XPos - getXPos()))))); //setzt den Winkel mit tan^-1
  92.     }
[/code]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 10, 2008 17:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
1. Nur eine Frage pro Thread bitte, der Übersichtlichkeit halber.

2. Andererseits kann man dir nichts vorwerfen. Wo ist deine Frage? :wink:

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 10, 2008 18:07 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
hehe ok, ich lager es aus...^^


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.009s | 14 Queries | GZIP : On ]