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

Aktuelle Zeit: Fr Jul 18, 2025 00:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Ebene an 3 Punkten ausrichten
BeitragVerfasst: Mi Apr 14, 2010 11:13 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Hallo zusammen,

ich möchte eine Fläche (Quad) so verschieben und rotieren das sie genau 3 im Raum befindliche Punkte schneidet.

In meinem Beispiel habe ich 3 Punkte, an deren Ebene ich entlang schneiden (clippen) möchte. Zur Anschaung will ich erst einmal ein Quad anstelle der Clippingplane verwenden.
(UpVector im Koordinatensystem = 0, 0, 1);

Hier mein Beispielcode:

Code:
var
  V1: TGLVector;
  V2: TGLVector;
  V3: TGLVector;
  N1: TGLVector;
  NewPos: TGLVector;

  WinkelA: Double;
  WinkelB: Double;
  WinkelC: Double;
begin
  // Die 3 Punkte
  V1.X := -24.85;
  V1.Y := -5.01;
  V1.Z := 2.98;

  V2.X := -23.82;
  V2.Y := 24.99;
  V2.Z := 2.98;

  V3.X := 0.01;
  V3.Y := 23;
  V3.Z := 23.94;

  // Schwerpunkt der 3 Punkte
  InitVector(NewPos, (V1.X + V2.X + V2.X) / 3, (V1.Y + V2.Y + V2.Y) / 3,
    (V1.Z + V2.Z + V2.Z) / 3);
  N1 := GetNormal(V1, V2, V3);

  // Normalen für jede Achse
  InitVector(V1, 1, 0, 0);
  InitVector(V2, 0, 1, 0);
  InitVector(V3, 0, 0, 1);

  // Der Kosinus für jeden Winkel (Beide Ebenennormalen im Vergleich)
  WinkelA := ScalarProduct(N1, V1);
  WinkelB := ScalarProduct(N1, V2);
  WinkelC := ScalarProduct(N1, V3);

  // RAD jedes Winkel ermitteln
  WinkelA := ArcCos(WinkelA);
  WinkelB := ArcCos(WinkelB);
  WinkelC := ArcCos(WinkelC);

  // Umwandel in Grad
  WinkelA := RadToGrad(WinkelA);
  WinkelB := RadToGrad(WinkelB);
  WinkelC := RadToGrad(WinkelC);

  glPushMatrix;
    // Erst zum Schwerpunkt bewegen
    glTranslatef(NewPos.X, NewPos.Y, NewPos.Z);

    // Dann um die jeweiligen Winkel drehen
    glRotatef(WinkelA, 1, 0, 0);
    glRotatef(WinkelC, 0, 1, 0);
    glRotatef(WinkelB, 0, 0, 1);

    glColor4f(1, 0, 0, 0.1);

    glBegin(GL_QUADS);
      glVertex3d(-BoundingboxSize.X / 2, 0, -BoundingboxSize.Z / 2);
      glVertex3d(-BoundingboxSize.X / 2, 0, BoundingboxSize.Z / 2);
      glVertex3d(BoundingboxSize.X / 2, 0, BoundingboxSize.Z / 2);
      glVertex3d(BoundingboxSize.X / 2, 0, -BoundingboxSize.Z / 2);
      glVertex3d(-BoundingboxSize.X / 2, 0, -BoundingboxSize.Z / 2);
    glEnd;
    glColor4f(1, 0, 0, 1);
    glBegin(GL_LINE_LOOP);
      glVertex3d(-BoundingboxSize.X / 2, 0, -BoundingboxSize.Z / 2);
      glVertex3d(-BoundingboxSize.X / 2, 0, BoundingboxSize.Z / 2);
      glVertex3d(BoundingboxSize.X / 2, 0, BoundingboxSize.Z / 2);
      glVertex3d(BoundingboxSize.X / 2, 0, -BoundingboxSize.Z / 2);
      glVertex3d(-BoundingboxSize.X / 2, 0, -BoundingboxSize.Z / 2);
    glEnd;
  glPopMatrix;
end;


Irgendwie liegt das Quad ganz komisch in der Scene.
Ich mache bestimmt einige Sachen falsch. Aber welche?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ebene an 3 Punkten ausrichten
BeitragVerfasst: Mi Apr 14, 2010 11:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also ich sehe da irgendwelche Winkelberechnungen, was machst du da?!

Also um eine Ebene mathematisch darzustellen gibt es zwei Möglichkeiten:
  1. Implizite Darstellung durch 4 Koeffizienten (a,b,c,d):
    ax + by + cz + d = 0
    Wenn du einen Punkt (x,y,z) in die Gleichung einsetzt kannst du testen auf welcher Seite der Ebene ein Punkt liegt oder ob er auf der Ebene ist: <0, >0 bzw. =0
    Die Koeffizienten a,b,c sind die Normale der Ebene, d ist der Abstand vom Ursprung (0,0,0), zumindest wenn die Normale normalisiert wurde.
  2. Explizite Darstellung durch einen Stützpunkt P und zwei Vektoren U,V:
    (x,y,z) = P + s*U + t*V
    Diese Darstellung eignet sich um Punkte auf der Ebene zu finden indem man einfach Werte für die Skalare s und t einsetzt.

Also wenn du dein Quad zeichnen willst brauchst du 4 Punkte. 3 hast du schon, benötigt wird ein weiterer Punkt auf der gleichen Ebene. Gegeben sind A,B und C, gesucht ist D.
U = B-A
V = C-A
D = A + 1*U + 1*V
Das ist also die explizite Form. Für die implizite Form berechnest du zuerst die Normale (a,b,c) und dann den Abstand d indem du einen bekannten Punkt auf der Ebene in die Gleichung einsetzt:
U = B-A
V = C-A
(a,b,c) = crossproduct(U,V)
d = -(a*A.x + b*A.y + c*A.z)



Edit: Oder geht es dir um die Transformationsmatrix? In dem Fall brauchst du ebenfalls keine Winkelberechnungen:
1. Wähle einen Mittelpunkt M für dein Quad, z.B. das arithmetische Mittel aus deinen drei Punkten A,B und C.
2. Baue dir ein lokales Koordinatensystem...also drei zu einander orthogonale Vektoren:
X = normalize(A - M);
Y = normalize(B - M);
Z = crossproduct(X,Y);
Y = crossproduct(X,Z); // Y orthogonal zu X und Z machen
3. Das ganze jetzt in eine Matrix packen:
Code:
X.x X.y X.z 0
Y.x Y.y Y.z 0
Z.x Z.y Z.z 0
M.x M.y M.z 1

Diese Matrix transformiert ein Quad welches in der XY-Ebene liegt dahin wo du es haben willst. Um die Matirx zu setzen brauchst du glLoadMatrixf oder glMultMatrixf. Möglicherweise musst du mit den Vorzeichen von Y und Z spielen, falls da was ungewollt gespiegelt wird.

_________________
Yeah! :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 4 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.006s | 15 Queries | GZIP : On ]