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

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

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Vertices unterteilen
BeitragVerfasst: Mo Jun 10, 2013 13:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Hallo,
Ich habe aktuell wieder Zeit an meinem Spiel weiter zu schreiben (diesmal mit besserem Konzept und Code Struktur :wink: ). Zurzeit baue ich (mal wieder) die Physik in das Spiel ein. Um auf Kollisionen besser reagieren zu können wollte ich Modelle in Spheres unterteilen oder durch eine Ebene trennen (Ich bin mir nicht sicher was besser funktioniert). In jedem Fall müsste ich allerdings eine Ebene kennen, welche die Vertices relativ gleichmäßig zerteilt. Bis jetzt habe ich versucht eine Ebene durch den Mittelpunkt der Vertices zu legen. Allerdings bin ich mir nicht sicher, wie ich die Drehung bzw. die Normale dieser Ebene berechnen kann. Falls jemand von euch weis oder eine Methode kennt wie man diese Normale an besten berechnet oder sagen kann ob dieser Ansatz überhaupt Sinn macht würde ich mich auf Anworten freuen.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertices unterteilen
BeitragVerfasst: Mo Jun 10, 2013 21:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
http://de.wikipedia.org/wiki/Singul%C3%A4rwertzerlegung

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertices unterteilen
BeitragVerfasst: Mo Jun 10, 2013 22:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Vielleicht ein klein wenig mehr Detail ;)

Die Singulärwertzerlegung (SVD) lässt sich benutzen um eine Ebene möglichst optimal durch eine Punktmenge zu legen. Optimal heißt hier das die Summe der quadrierten Abstände der Punkte zur Ebene minimiert wird. SVD implementiert man üblicherwiese nicht selbst, sondern man sollte sich eine Libary suchen, z.B. wie hier eine Mischung aus Coolmath und LAPACK++

Code:
  1.  
  2. #include <lapackpp/lavd.h>
  3. #include <lapackpp/lasvd.h>
  4. #include <lapackpp/laexcp.h>
  5.  
  6. CML::Plane3d GeomUtil::computeLeastSquaresPlane(const std::vector<CML::Vector3d>& points,
  7.                                                 bool* error)
  8. {
  9.     if (points.empty()) {
  10.         if (error != NULL) { *error = true; }
  11.         return CML::Plane3d(0,1,0,0);
  12.     }
  13.  
  14.     CML::Vector3d center(0,0,0);
  15.     std::vector<CML::Vector3d>::const_iterator itr, end = points.end();
  16.     for (itr = points.begin(); itr != end; ++itr) {
  17.         center += *itr;
  18.     }
  19.     center *= 1.0/points.size();
  20.  
  21.    
  22.     LaGenMatDouble W = LaGenMatDouble::zeros(3,3);
  23.     for (itr = points.begin(); itr != end; ++itr) {
  24.         CML::Vector3d p = *itr - center;
  25.         W(0,0) += p.x * p.x;
  26.         W(0,1) += p.x * p.y;
  27.         W(0,2) += p.x * p.z;
  28.         W(1,0) += p.y * p.x;
  29.         W(1,1) += p.y * p.y;
  30.         W(1,2) += p.y * p.z;
  31.         W(2,0) += p.z * p.x;
  32.         W(2,1) += p.z * p.y;
  33.         W(2,2) += p.z * p.z;
  34.     }
  35.     LaVectorDouble Sigma(3);
  36.     LaGenMatDouble U;
  37.     LaGenMatDouble VT(3,3);
  38.     try {
  39.         LaSVD_IP(W, Sigma, U, VT);
  40.     }
  41.     catch (LaException e) {
  42.         if (error != NULL) { *error = true; }
  43.         return CML::Plane3d(CML::Vector3d(0,1,0), center);
  44.     }
  45.  
  46.     if (error != NULL) {
  47.         *error = (Sigma(2) < 1.0e-16);
  48.     }
  49.  
  50.     CML::Vector3d normal(VT(2,0), VT(2,1), VT(2,2));
  51.     return CML::Plane3d(normal, center);
  52. }

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertices unterteilen
BeitragVerfasst: Di Jun 11, 2013 10:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Vielen Dank Coolcat :D . Wenn man den Namen der Methode kennt findet man ja relativ viele Informationen dazu. Ich werde es als Übung wahrscheinlich einmal selber implementieren, damit kann ich auch gleich meine Math-Library testen/erweitern.

_________________
You even trying ...

Website: http://rise-of-light.de/


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


Wer ist online?

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