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

Aktuelle Zeit: Di Jul 15, 2025 06:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Sep 22, 2003 15:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Wenn ich ein Vertex oder ein face Selektieren möchte klappt das manch mal und manch mal nicht. Hier sind die Sourcen vielleicht findet einer von euch den Fehler. Bei den Vertices klappt es 100 pro aber bei Faces überschneiden sich die Regionen.
Code:
  1.  
  2. procedure TfrmXY.PaintBoxXYClick(Sender: TObject);
  3. var
  4.   i,count : integer;
  5.   v : Tvertex;
  6.   f : TFace;
  7.   VertexRec,MausRec,resultRec,SphereRec : TRect;
  8.   FaceRegion,FaceRegion2 : HRGN;
  9.   V1,V2,V3,V4 : TPoint;
  10.   points : array[1..4] of TPoint;
  11.   points2 : array[1..4] of TPoint;
  12.   s : TSphere;
  13.   MinZ : Single;
  14.   SelItem: Integer;
  15. begin
  16.   ...
  17.   MausRec.Left := FPaintMous.X-1;
  18.   MausRec.Top :=  FPaintMous.y-1;
  19.   MausRec.Right := MausRec.Left +2;
  20.   MausRec.Bottom := MausRec.Top +2;
  21.  
  22.   //Vertices durchgehen
  23.   MinZ := -MaxInt;
  24.   SelItem := -1;
  25.   for i:=0 to FVertexList.Count-1 do begin
  26.     //vertex berechnen
  27.     if IntersectRect(resultRec,VertexRec,MausRec) then
  28.       if TVertex(FVertexList.Objects[i]).FZ > MinZ then begin
  29.         SelItem := i;
  30.         MinZ := v.z;
  31.       end;
  32.   end;
  33.   // nachdem alle Punkte geprüft wurden.
  34.   if (SelItem >= 0) then begin
  35.     v := Tvertex(FVertexList.Objects[SelItem]);
  36.     ...
  37.   end;
  38.  
  39.   //Faces durchgehen
  40.   MinZ := -MaxInt;
  41.   SelItem := -1;
  42.   for i:=0 to FFaceList.Count-1 do begin
  43.     //Region eins erstellen
  44.     V1.X := ScrollBarZoomX.Position + Round(+TFace(FFaceList.Objects[i]).V1.Fx * FZoom)+Round(VerticesDraw.Size * 20);
  45.     V1.Y := ScrollBarZoomY.Position + Round(-TFace(FFaceList.Objects[i]).V1.FY * FZoom)+Round(VerticesDraw.Size * 170);
  46.  
  47.     V2.X := ScrollBarZoomX.Position + Round(+TFace(FFaceList.Objects[i]).V2.Fx * FZoom)+Round(VerticesDraw.Size * 170);
  48.     V2.Y := ScrollBarZoomY.Position + Round(-TFace(FFaceList.Objects[i]).V2.FY * FZoom)+Round(VerticesDraw.Size * 170);
  49.  
  50.     V3.X := ScrollBarZoomX.Position + Round(+TFace(FFaceList.Objects[i]).V3.Fx * FZoom)+Round(VerticesDraw.Size * 170);
  51.     V3.Y := ScrollBarZoomY.Position + Round(-TFace(FFaceList.Objects[i]).V3.FY * FZoom)+Round(VerticesDraw.Size * 20);
  52.  
  53.     V4.X := ScrollBarZoomX.Position + Round(+TFace(FFaceList.Objects[i]).V4.Fx * FZoom)+Round(VerticesDraw.Size * 20);
  54.     V4.Y := ScrollBarZoomY.Position + Round(-TFace(FFaceList.Objects[i]).V4.FY * FZoom)+Round(VerticesDraw.Size * 20);
  55.  
  56.     points[1] := v1;
  57.     points[2] := v2;
  58.     points[3] := v3;
  59.     points[4] := v4;
  60.     count := 4;
  61.     FaceRegion := CreatePolygonRgn(points,count,WINDING);
  62.  
  63.     //region zwei erstellen
  64.     V1.X := ScrollBarZoomX.Position + Round(+TFace(FFaceList.Objects[i]).V1.Fx * FZoom)+Round((VerticesDraw.Size*180));// * 100
  65.     V1.Y := ScrollBarZoomY.Position + Round(-TFace(FFaceList.Objects[i]).V1.FY * FZoom)+Round((VerticesDraw.Size*50));// /80
  66.  
  67.     V2.X := ScrollBarZoomX.Position + Round(+TFace(FFaceList.Objects[i]).V2.Fx * FZoom)+Round((VerticesDraw.Size*50));// /80
  68.     V2.Y := ScrollBarZoomY.Position + Round(-TFace(FFaceList.Objects[i]).V2.FY * FZoom)+Round((VerticesDraw.Size*50));// /80
  69.  
  70.     V3.X := ScrollBarZoomX.Position + Round(+TFace(FFaceList.Objects[i]).V3.Fx * FZoom)+Round((VerticesDraw.Size*50));// /80
  71.     V3.Y := ScrollBarZoomY.Position + Round(-TFace(FFaceList.Objects[i]).V3.FY * FZoom)+Round((VerticesDraw.Size*180));
  72.  
  73.     V4.X := ScrollBarZoomX.Position + Round(+TFace(FFaceList.Objects[i]).V4.Fx * FZoom)+Round((VerticesDraw.Size*180));
  74.     V4.Y := ScrollBarZoomY.Position + Round(-TFace(FFaceList.Objects[i]).V4.FY * FZoom)+Round((VerticesDraw.Size*180));
  75.  
  76.     points2[1] := v1;
  77.     points2[2] := v2;
  78.     points2[3] := v3;
  79.     points2[4] := v4;
  80.     count := 4;
  81.     FaceRegion2 := CreatePolygonRgn(points2,count,WINDING);
  82.  
  83.     if RectInRegion(FaceRegion,MausRec) then
  84.       if not RectInRegion(FaceRegion2,MausRec) then
  85.         if Tface(FFaceList.Objects[i]).V1.Fz > MinZ then begin
  86.           SelItem := i;
  87.           MinZ := Tface(FFaceList.Objects[i]).V1.Fz;
  88.         end;
  89.   end;
  90.   if (SelItem >= 0) then begin
  91.     f := TFace(FFaceList.Objects[SelItem]);
  92.     ...
  93.   end;
  94.  

Mit FaceRegion und FaceRegion2 mach ich um das Face ein Quad und prüfe ob ich mit der Maus in der Region eins bin aber nicht in der region 2 sondern nur auf der Linie des Faces.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
//Nachtrag

Wenn ich z.b ein Face habe was aus vier Vertices besteht ist in der xy Ansicht ein Quad aber in der zy Ansicht eine Linie und wenn ich dann versuche diese Linie zu Selektieren klappt das nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 16:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
@SoS
Wie hast du die Selektion in deinem Editor gemacht?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 16:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
TOpenGL hat geschrieben:
@SoS
Wie hast du die Selektion in deinem Editor gemacht?

In ZornEdit kann man in den 2D-Ansichten nur die Vertices anwählen.Faces werden dann nur in der 3D-Ansicht über OpenGLs Selektionsmechanismus ausgewählt, um ihnen Eigenschaften (z.B. Material) zuzweisen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 17:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Und was ist wenn man ein Face mal verschieben muss.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 17:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
TOpenGL hat geschrieben:
Und was ist wenn man ein Face mal verschieben muss.

ZornEdit unterscheidet sich recht stark von "herkömmlichen" Editoren wie z.B. UnrealED oder Radiant, weshalb du da besser keine Vergleiche zwischen ZornEdit und deinem Editor ziehen solltest.
In ZornGL besteht ein Level aus Sektoren, und diese Sektoren bestehen aus miteinander verbundenen Wänden ("Faces"), also gibt es in dem Sinne keine Faces die man unabhängig verschieben könnte.Man verschiebt also keine Faces, sondern nur die Vertices und damit auch die dazugehörigen Faces.Das geschieht dann ganz einfach in dem man in einer 2D-Ansicht die Vertices verschiebt, den Rest macht der Editor.
Warum das so ist?Ich hatte ja nur knapp 6 Monate Zeit für mein ZornGL-Projekt (Editor+Netzwerkspiel) und konnte als ich diese Projekt für meine Abschlussarbeit vorgeschlagen hab noch nicht mal nen Würfel mit OpenGL zeichnen.Also hab ich dann nach ner GL-Lernphase nen Editor gebraucht, mit dem man schnell und unkompliziert Level basteln kann.Und da ich damals für DOOM(I) schon Level gebastelt hab, hab ich schnell nen Editor zusammengeschraubt, der es wie in DoomEd (Freeware-Mapeditor für DOOM) erlaubt in der Vogelperspektive durch das Setzen von Vertices komplette Level zu bauen.Man startet also irgendwo durch nen Mausklick in der Von-Oben-Ansicht einen Level, und beim nächsten Klick wird vom ersten Vertex bis zum neuen Vertex eine Wand (aus 2 Faces bestehend) erstellt (macht der Editor selbst).
Wie du siehst unterscheidet sich ZornEdit aufgrund er Anforderungen die ich damals hatte gravierend von den herkömmlichen 3D-Editoren.Ob das ein brauchbares Prinzip ist, war mir egal.Mir gings halt nur darum das ich in recht kurzer Zeit Kontent für mein Abschlussprojekt erstellen konnte.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 17:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Achso, dann werde ich es mal versuchen,vielleicht bekomme ich das verschieben von Faces hin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 02, 2003 10:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Zur Selektion eines Dreiecks mit der Maus hast du folgende Möglichkeiten:

1) du berechnest die Bildschirmkoordinaten der einzelnen Vertices (x,y) und schaust nach, ob die Mausposition drinnen ist (Achtung: die Überprüfung Punkt in Polygon ist nicht ganz trivial, da es sich um ein Dreieck handelt, kannst du dich aber auf konvexe Polygone beschränken)

2) Du legst die Dreiecke einzeln mit eindeutigen Namen (kannst ja einfach den Index in deiner Dreiecksliste verwenden) ab und verwendest den OpenGL Selektionsmodus - dürfte bei sehr vielen Dreiecken etwas langsam werden, sollte bis einige tausend Dreiecke aber keine Probleme machen.
Zwei Schritt Option: erst Selektionsmodus des Objektes, wenn bekannt, welches Objekt zerlegst du dieses in einzelne Dreiecke und selektierst nochmal - dann sollte es auf jeden Fall funzen.

3) die "Billigvariante": du berechnest wieder die Bildschirmkoordinaten der Vertices, berechnest dann den Mittelpunkt der Dreiecke (entweder Schwerpunkt oder arithmetisches Mittel der Eckpunkte - im Prinzip ohnehin Egal, wenn du nicht grausam verzogene Dreiecke verwendest) und schaust nach, welchem dieser Mittelpunkte der Mauscursor am Nächsten ist - sollte auch hinreichend genau sein.


Am Einfachsten zu implementieren - und am Exaktesten - ist sicher Methode zwei.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


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


Wer ist online?

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