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

Aktuelle Zeit: Di Jul 15, 2025 01:35

Foren-Übersicht » Programmierung » Einsteiger-Fragen
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: Selection
BeitragVerfasst: Di Sep 02, 2003 11:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
In meinem Editor sind z.Z 2 Rendercontexe doch wenn ich in meiner 3d Ansicht auf ein vertex klicke oder auf ein face bekomme ich immer mit meiner Methode "GetSelectBufferHit" 0 zurück. Wenn ich nur ein Contec habe klappt meine Function. Wieso irgend was habe ich nicht beachtet aber was.

Meine Function
Code:
  1.  
  2. function TfrmDraw.GetSelectBufferHit: Integer;
  3. var
  4.  SelectBuffer : array[0..512] of TGLUInt;
  5.  Viewport     : opengl12.TVector4i;
  6.  Hits,i       : Integer;
  7.  HitZValue    : TGLUInt;
  8.  Hit          : TGLUInt;
  9. begin
  10.   glGetIntegerv(GL_VIEWPORT, @viewport);
  11.   glSelectBuffer(512, @SelectBuffer);
  12.   glRenderMode(GL_SELECT);
  13.   glInitNames;
  14.   glPushName(0);
  15.   glMatrixMode(GL_PROJECTION);
  16.   glPushMatrix;
  17.   glLoadIdentity;
  18.   gluPickMatrix(mx, viewport[3]-my, 2.0, 2.0, viewport);
  19.   gluPerspective(45.0, ClientWidth/ClientHeight, 0.1, 100);
  20.  
  21.   DrawRoom;
  22.  
  23.   glMatrixMode(GL_PROJECTION);
  24.   glPopMatrix;
  25.  
  26.   Hits := glRenderMode(GL_RENDER);
  27.   DeactivateRenderingContext;
  28.  
  29.   Hit       := High(TGLUInt);
  30.   HitZValue := High(TGLUInt);
  31.   for i := 0 to Hits-1 do
  32.     if SelectBuffer[(i*4)+1] < HitZValue then begin
  33.       Hit       := SelectBuffer[(i*4)+3];
  34.       HitZValue := SelectBuffer[(i*4)+1];
  35.     end;
  36.   Result := Hit;
  37.   glMatrixMode(GL_MODELVIEW);
  38. end;
  39.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 11:40 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn dein Problem nur auftritt wenn du zwei Renderkontexte benutzt, dann musst du in dem Programm halt ganz einfach sicherstellen das du dich bei der Selektion und dann auch beim Zeichnen der Szene für die Selektion im korrekten Renderkontext befindest.Da du zu dieser Thematik aber keinen Quellcode gepostest hast, ists schwer dir hier zu helfen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 12:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Das ist meine Click Methode des Pannels
Code:
  1.  
  2. procedure TfrmDraw.PanelShowClick(Sender: TObject);
  3. var
  4.   i : integer;
  5.   v : TVertex;
  6.   f : TFace;
  7.   obj : TObject;
  8. begin
  9.   ...
  10.   GLDrawBox3D.Activate;  //Contex wechseln
  11.   i := GetSelectBufferHit;    
  12.   obj := SelectedHandler.GetTypFromInt(i);
  13.   if obj.ClassType = TVertex then begin    //Tvertex ?
  14.     ...
  15.   end else if obj.ClassType = TFace then begin    //TFace ?
  16.     ...
  17.   end;
  18. end;
  19.  


Und hier werden die Faces und Vertices gezeichnet (Application.onIdle)
Code:
  1.  
  2. procedure TfrmDraw.DrawEngine(Sender: TObject; var Done: Boolean);
  3. var
  4.   i : integer;
  5. begin
  6.   Application.ProcessMessages;
  7.   //3D Zeichnen
  8.   VerticesDraw.ViewMode := 0;
  9.   FacesDraw.ViewMode := 0;
  10.  
  11.   frmMain.GL3DEngine.SetGLBox(GLDrawBox3D); //An welcher GLBox soll die Ausgabe erfolgen
  12.   frmMain.GL3DEngine.Clear([0.2,0.2,0.2,0]);  //Contex wird auch gewechselt
  13.  
  14.   glRotatef(YRotation,0,1,0);
  15.   glTranslatef(-Position.X,Position.y,-Position.Z);
  16.   DrawRoom;  //Zeichnen der vertices und Faces
  17.  
  18.   frmDraw.Caption := '3D '+frmMain.GL3DEngine.DrawBox.StrFPS;
  19.   frmMain.GL3DEngine.Flip;
  20.  
  21.   //xy Zeichnen
  22.   Application.ProcessMessages;
  23.   frmMain.GL3DEngine.SetGLBox(frmXY.GLDrawBoxXY); //Box wechseln
  24.   frmMain.GL3DEngine.Clear([0.2,0.2,0.2,0]); //Contex wechseln
  25.   VerticesDraw.ViewMode := 1;
  26.   FacesDraw.ViewMode := 1;
  27.   glTranslatef(0,0,-10);
  28.   DrawRoom;
  29.   frmMain.GL3DEngine.Flip;
  30. end;
  31.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 12:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn du mal sagen würdest, worauf deine 2 Renderkontexte basieren, wäre die Sache auch etwas einfacher.Wenn du z.B. zwei Panels hast, dann gehe ich einfach mal davon aus, das du die Mauskoordinaten nicht korrekt berechnest (z.B. absolute Koordinaten statt relativer Koordinaten), das würde auch erklären warum dann z.B. im zweiten RC die Selektion nicht funktioniert.Lass dir also irgendwo mal mx und my ausgeben, und dann solltest du ganz schnell erkennen ob da was nicht stimmt.
Ausserdem ist mir aufgefallen, das du in deiner Selektion deine Szene ja gar nicht entsprechend der Spielerposition und dessen Blickwinkel ausrichtest, während du das in DrawEngine aber machst...das dürfte auch ein Problem sein und führt mit großer Wahrscheinlichkeit zu Fehlern.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 12:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Son of Satan hat geschrieben:
Wenn du mal sagen würdest, worauf deine 2 Renderkontexte basieren, wäre die Sache auch etwas einfacher.Wenn du z.B. zwei Panels hast...

Sind von TPanel abgeleitet

Son of Satan hat geschrieben:
dann gehe ich einfach mal davon aus, das du die Mauskoordinaten nicht korrekt berechnest (z.B. absolute Koordinaten statt relativer Koordinaten), das würde auch erklären warum dann z.B. im zweiten RC die Selektion nicht funktioniert.Lass dir also irgendwo mal mx und my ausgeben, und dann solltest du ganz schnell erkennen ob da was nicht stimmt.

Mauskoordinaten habe ich überprüft und stimmen auch.

Son of Satan hat geschrieben:
Ausserdem ist mir aufgefallen, das du in deiner Selektion deine Szene ja gar nicht entsprechend der Spielerposition und dessen Blickwinkel ausrichtest, während du das in DrawEngine aber machst...das dürfte auch ein Problem sein und führt mit großer Wahrscheinlichkeit zu Fehlern.

Habe ich geändert.

Selection funktioniert immer noch nicht.
Dann man ich es doch besser wie du schon mal gesagt hast und zeichne die anderen Fenster selber. Dazu habe ich auch direkt eine Frage, wie hast du die Vertices und Faces gezeichet. so?
Code:
  1.  
  2.   //Vertex Zeichnen
  3.   Canvas.Brush.Color := Clred;
  4.   Canvas.Rectangle(x1,y1,x2,y2);
  5.  


Habe es mal versucht mit einer Function die man ein Vertex übergibt.
Habe eine for schleife gemacht und jeden vertex der Funktion übergeben.
Diese Funktion zeichnet dann den vertex.

Welche Methode ist besser/schneller selber zeichnen oder noch ein GLContex erstellen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 12:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
TOpenGL hat geschrieben:
Habe es mal versucht mit einer Function die man ein Vertex übergibt.
Habe eine for schleife gemacht und jeden vertex der Funktion übergeben.
Diese Funktion zeichnet dann den vertex.

Welche Methode ist besser/schneller selber zeichnen oder noch ein GLContex erstellen?


Ich hab bei ZornEdit weder GDI noch OpenGL zum Zeichnen der 2D-Ansicht genutzt, sondern FastDIB.Dessen Syntax ist aber fast identisch mit der Syntax der GDI, gat allerdings den Vorteil dass das Zeichnen weitaus schneller abläuft.
Gezeichnet hab ich alle Vertexe mittels FillRect in ner einfachen Schleife, und die Koordinaten hängen dabei ja von der Ansicht ab (z.b. X/Y bei der Seitenansicht).Ausserdem hag ich natürlich noch via MoveTo und LineTo die Vertexe verbunden.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 12:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Son of Satan hat geschrieben:
... FastDIB.Dessen Syntax ...

Was ist das?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 12:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Eine "Ersatzunit" für die GDI (im groben Sinne).FastDIB bietet die selben Funktionen wie die GDI, ist aber um einiges schneller.google sollte dir bei der Suche behilflich sein, da ich die URL von der ich FastDIB hab nicht mehr kenne.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 12:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
danke werde mal suchen. Mal schauen ob ich das hinbekommen werde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 13:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
habe FastLib gefunden aber nicht FastDib. FastLib besteht aus den Units "Fast256.pas FastBMP.pas FastDraw.pas FastFX.pas FastIMG.pas FastRGB.pas" habe aber keine FastDib unit gefunden


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 13:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Sieht schlecht aus.Hab grad meine Backups durchsucht, und FastDIB leider nicht gefunden, und die URL von der ichs her hab ist auch schon seit Langem nicht mehr erreichbar.
Da die Syntax der GDI und von FastDIB allerdings fast gleich ist, kannst du beruhigt damit anfangen deine Ansichten mittels GDI zu zeichnen, denn ein paar Linien und Rechtecke kann man mittels Doublebuffering auch über die GDI schnell genug zeichnen.Der Grund warum ich statt der GDI FastDIB benutzt hab lag sowieso wo anders.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 13:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Trotzdem danke werde es dann mal versuchen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 14:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Muss leider noch mal fragen, ich hoffe meine Fragen nerven nicht.
Habe jetzt eine Schleife und mein Vertices zeichne ich mit FillRect aber FillRect braucht Integer, meine vertices sind aber Single. Soll ich die jetzt runden oder meine aus meinen vertices Koordinaten Integer machen oder wie.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 14:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Da man Pixel sowieso nur auf Integerbasis setzen kann, solltest du deine Werte am besten mittel Round() runden.Das mach ich auch so, und eine andere Lösung bietet sich auch nicht an.
Deine Vertexstrukturen auf Integer umzustellen wäre nämlich keine wirkliche Alternative, da dies jede Menge Probleme mit sich bringen könnte.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2003 14:52 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Im grunde musst du die Singles nur umrechnen in Pixel.
Sagst z.b. (0.0 - 1.0) = (0 - 10 pixel). Dann multiplizierst einfach deine coord * 10 oder wie dus halt haben willst.

Das hat nämlich den vorteil das du später nur noch den 10 wert in ne Zoom variable speichern brauchst und du dann sogar gleich zoom integriert hast.

Du wirst vielleicht später auch noch auf ein problem stosen das die OGL Coords ja nicht nur 0 - x sonder -x - x sind... das heisst du willst das alles im mittelpunkt von der Paintbox gezeichnet wird, schau dir mal meinen alten editor an: http://encorex.no-ip.com/shared/Final/editor.zip

Da siehst du vielleicht was ich mein.

matane,
Final

Edit*: Hab dir als Attachment ne schnelle Paintbox mitgebracht, das ist so was ähnlich wenn nich sogar das gleiche wie das FastDIB ;D


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


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 » Einsteiger-Fragen


Wer ist online?

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