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

Aktuelle Zeit: Fr Jul 18, 2025 08:10

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Entfernung 2er Vektoren
BeitragVerfasst: Di Jul 06, 2010 16:12 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Moin,

ich will meine Objekte entsprechend zur "Kamera" sortieren. Dazu bräuchte ich eine Funktion welche mir die entfernung 2er Vektoren voneinander berechnet?!
Hat da jemand was auf lager?

Mfg,
Thomas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Di Jul 06, 2010 16:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Entfernung der Vektoren a und b:
|a - b|


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Di Jul 06, 2010 16:20 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
und sieht das praktisch aus?

Code:
function Distance(v1, v2: TVektor3f): Single;
begin
 ?!
end;


was ich gefunden habe ist das hier sqrt((x1-x2)² + (y1-y2)² + (z1-z2)²)
doch ich denke das wird nicht allzu performant sein oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Di Jul 06, 2010 16:20 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Du hast deine beiden Vektoren v1 und v2. Dann rechnest du v1 - v2 (also v1.x - v2.x, v1.y - v2.y und v1.z - v2.z). Von dem resultierendem Vektor brechnest du die Länge, die ist der Abstand den du haben willst. Die Länge (l) eines Vektors berechnet man so:

l = sqrt(x*x + y*y + z*z);

Wenn du nur testen willst, ob eine Länge größer ist als eine andere, kannst du dir die teure Wurzelberechnung auch sparen und die Längen zum Quadrat miteinander vergleichen.


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:23, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Di Jul 06, 2010 16:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
was ich gefunden habe ist das hier sqrt((x1-x2)² + (y1-y2)² + (z1-z2)²)
doch ich denke das wird nicht allzu performant sein oder?

Wie gesagt, wenn du nur die Distanzen vergleichen willst, nicht aber den exakten Wert der Distanz benötigst kannst du die Wurzel weglassen. Die Wurzel ist eigentlich das einzig aufwendige an dieser Operation, alles andere kannst du vernachlässigen.

Code:
function Distance(v1, v2: TVektor3f): Single;
var x,y,z: Single;
begin
x := v1.x - v2.x;
y := v1.y - v2.y;
z := v1.z - v2.z;
result := sqrt(x*x + y*y + z*z);
end;

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Di Jul 06, 2010 17:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

wenn er das ganze aber relativ zur Kamera machen will, dann geht das nicht so. Dann müsste man erst den Vektor der Blickrichtung berechnen und dann relativ dazu die Entfernung der Positionen.

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Di Jul 06, 2010 18:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also ich hab das jetzt so verstanden das er die Distanz zwischen Kamera und Objekt wissen will und eben danach sortieren. Sofern die Position von Kamera und Objekt bekannt ist, ist das mit der obigen Funktion kein Problem.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Di Jul 06, 2010 19:43 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
so ganz unrecht hat der Bergmann nicht. Ich hab gedacht, das das ermitteln der Kamera Position einfach ist.. doch da hab ich mich getäuscht..
Also ich mache folgendes..
Code:
 glpushmatrix()
   gltranslatef(xMov, -yMov, zMov);
   glRotatef(yRot, 1, 0, 0);
   glRotatef(xRot, 0, 1, 0);   
   renderObjects;
 glpopMatrix();


somit hab ichs wie z.B. bei C4D oder 3dm. So nun dachte ich mir das die "Kamera", welche ja keine ist auf Position -xMov, yMov, -zMov ist.. Dem ist aber nicht so.. denn ich hab die Rotation vergessen...
wie komm ich denn nun am einfachsten an die Position?!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Di Jul 06, 2010 20:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
wie komm ich denn nun am einfachsten an die Position?!


Code:
var matrix : array[0..15] of Single;
    camx, camy, camz : Single;

// nach dem letzten glRotate
glGetFloatv(GL_MODELVIEW_MATRIX, @matrix);
camx := -matrix[12];
camy := -matrix[13];
camz := -matrix[14];

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Mi Jul 07, 2010 07:56 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ne, das stimmt irgendwie auch nich. Da wird die Rotation irgendwie nicht mit beachtet..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Mi Jul 07, 2010 08:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Das sollte eigentlich funktionieren. Hast du die Rotation etwa im Matrix-Modus GL_PROJECTION gesetzt? Die Kamera-Transformation gehört in GL_MODELVIEW, nur die eigentliche Projektion (z.B. über gluPerspective) gehört in GL_PROJECTION. Es gibt natürlich Umstände bei denen man alles in die Projektionsmatrix packen muss (*), aber die sind hier mit hoher Wahrscheinlichkeit nicht gegeben. In jedem Fall musst du mit Problemen wie beispielsweise mit falsch transformierten Normalen rechnen, wenn GL_PROJECTION Rotationen oder Translationen (Verschiebung) enthält.


(*) z.B. bei meiner Diplomarbeit projiziere ich 3D-Geometrie in ein Foto hinein wobei die Projektionsmatrix vorgegeben ist und bereits sämtliche Transformationen enthält.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Mi Jul 07, 2010 08:45 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ne, transformation und rotation geschiet alles in der Modelview Matrix...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Mi Jul 07, 2010 08:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Und du hast das jetzt auch nach dem letzten glRotatef und vor renderObjects() eingefügt?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Mi Jul 07, 2010 08:58 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
hier noch der Kopf von der Renderproc
Code:
procedure TMainForm.Render;
var
  h: Integer;
  matrix : array[0..15] of Single;
begin
glMatrixMode(GL_PROJECTION);
// Identitätsmatrix laden
glLoadIdentity;

// Viewport an Clientareal des Fensters anpassen
glViewPort(0, 0, Panel1.Width, Panel1.Height);

// Perspective, FOV und Tiefenreichweite setzen
gluPerspective(60, Panel1.Width / Panel1.Height, 0.2, 200);

// In die Modelansichtsmatrix wechseln
glMatrixMode(GL_MODELVIEW);
// Identitätsmatrix laden
glLoadIdentity;


// Farb- und Tiefenpuffer löschen
glClearColor(0, 0, 0, 0);

 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);


 glPushMatrix();

    gltranslatef(xMov, -yMov, zMov);

         glRotatef(yRot, 1, 0, 0);
         glRotatef(xRot, 0, 1, 0);


         glGetFloatv(GL_MODELVIEW_MATRIX, @matrix);
         cam_[0] := matrix[12];
         cam_[1] := matrix[13];
         cam_[2] := matrix[14];

      RenderObjects;

//Cam Position anzeigen
//Hier sehe ich das die Position der Cam nur auf glTranslate reagiert...
 glColor3f(1, 0, 0);

 glDisable(GL_LIGHTING);
 glbegin(GL_LINES);
  glColor3f(0, 1, 0);
  glVertex3f(cam_[0], cam_[1], cam_[2]);
  glVertex3f(cam_[0]+0.5, cam_[1], cam_[2]);
 glEnd;

  glbegin(GL_LINES);
  glVertex3f(cam_[0], cam_[1], cam_[2]);
  glVertex3f(cam_[0], cam_[1]+0.5, cam_[2]);
 glEnd;

  glbegin(GL_LINES);
  glVertex3f(cam_[0], cam_[1], cam_[2]);
  glVertex3f(cam_[0], cam_[1], cam_[2]+0.5);
 glEnd;
glEnable(GL_LIGHTING);


glPopMatrix();
...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Entfernung 2er Vektoren
BeitragVerfasst: Mi Jul 07, 2010 09:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Das Minus fehlt:
Code:
         cam_[0] := -matrix[12];
         cam_[1] := -matrix[13];
         cam_[2] := -matrix[14];

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 17 Queries | GZIP : On ]