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

Aktuelle Zeit: Fr Jul 18, 2025 14:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kein Select der Objekte...
BeitragVerfasst: So Sep 09, 2007 11:55 
Offline
DGL Member

Registriert: Sa Aug 04, 2007 19:22
Beiträge: 5
Hallo Leuts,

ich versuch mir grad 'n objekt zu schreiben, das es auch solchen dummies, wie mich, ermöglicht mal ein OGL auf den Bildschirm zu zaubern, doch leider klappt das noch nicht ganz ...

hier mein Beispielcode:

Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, glObj, dglOpenGL;
  8.  
  9. type
  10.   tMyGL = class(tGL)
  11.    procedure ErrorHandler; override;  
  12.    procedure run;          override;
  13.    procedure OnLastHit(sender: tObject);
  14.   end;
  15.  
  16.   TForm1 = class(TForm)
  17.     procedure FormCreate(Sender: TObject);
  18.     procedure FormDestroy(Sender: TObject);
  19.   private
  20.     { Private-Deklarationen }
  21.     gl: tMyGL;
  22.    
  23.   public
  24.     { Public-Deklarationen }
  25.   end;
  26.  
  27. var
  28.   Form1: TForm1;
  29.  
  30. implementation
  31.  
  32. {$R *.dfm}
  33.  
  34. procedure TForm1.FormCreate(Sender: TObject);
  35. begin
  36.  gl := tMyGl.create(self.Handle, application, self);
  37.  gl.IsSelectNames := true;
  38.  gl.OnHit := gl.OnLastHit;
  39. end;
  40.  
  41. procedure TForm1.FormDestroy(Sender: TObject);
  42. begin
  43.  if gl <> NIL then FreeAndNil(GL);
  44. end;
  45.  
  46. procedure tMyGL.OnLastHit(sender: tObject);
  47. begin
  48.  case LastHit of
  49.   1: printtext(20,20, 'in Eins');
  50.   2: printText(20,20, 'in Zwei');
  51.   3: printText(20,20, 'in Drei');
  52.  end;
  53. end;
  54.  
  55. { tMyGL }
  56.  
  57. procedure tMyGL.ErrorHandler;
  58. begin
  59.  
  60. end;
  61.  
  62. procedure tMyGL.run;
  63. begin
  64.   glTranslatef(0,0,-6);
  65.  
  66.   glColor3f(1,0,0);
  67.   glLoadName(1);
  68.   glBegin(gl_triangles);
  69.     glVertex3f(-0.5,1,0);
  70.     glVertex3f(0.5,1,0);
  71.     glVertex3f(0,2,0);
  72.   glEnd;
  73.  
  74.   glLoadName(2);
  75.   glColor3f(0,1,0);
  76.   glBegin(gl_quads);
  77.     glVertex3f(-1,0,0);
  78.     glVertex3f(-2,0,0);
  79.     glVertex3f(-2,-1,0);
  80.     glVertex3f(-1,-1,0);
  81.   glEnd;
  82.  
  83.   glLoadName(3);
  84.   glColor3f(1,1,0);
  85.   glBegin(gl_triangles);
  86.     glVertex3f(1,0,0);
  87.     glVertex3f(2,0,0);
  88.     glVertex3f(1.5,-1,0);
  89.  
  90.     glVertex3f(1,-0.65,0);
  91.     glVertex3f(2,-0.65,0);
  92.     glVertex3f(1.5,0.35,0);
  93.   glEnd;
  94. end;
  95.  
  96. end.


der selektiert jedoch nicht das letzte gefunde objekt... weiss jemand, an was es liegen kann...

hier noch die klasse dazu...

Code:
  1. unit glObj;
  2. interface
  3. uses dglOpenGL, Windows, Forms, sysutils, Classes;
  4.  
  5. type
  6.  tGLClearColor = record
  7.   red, green, blue, alpha: single;
  8.  end;
  9.  
  10.  tGL = class
  11.   private
  12.    RC               : HGLRC;
  13.    DC               : HDC;
  14.    FontBase         : GLUInt;
  15.    StartTick        : Cardinal;
  16.    fLastError       : word;
  17.    fHandle          : HWND;
  18.    fFrames          : Integer;
  19.    fFPS             : Single;
  20.  
  21.    fClearColor      : tGLClearColor;
  22.    fNearClipping    ,
  23.    fFarClipping     : word;
  24.    ffovy            : single;
  25.    
  26.    fSavedOnIdle     : TIdleEvent;
  27.    fRaise_error     : boolean;
  28.    f_if_full_screen : boolean;
  29.    fSelectNames     : boolean;
  30.    fLastHit         : integer;
  31.  
  32.    fHitEvent        : TNotifyEvent;
  33.    
  34.    procedure wClearColor(const Value: TGLClearColor);
  35.    
  36.   protected
  37.    fForm            : tForm;
  38.    fApp             : tApplication;
  39.    
  40.   public
  41.    constructor create(handle: HWND;
  42.                       const TApp  : TApplication;
  43.                       const Form  : tForm;
  44.                       fullscreen  : boolean = false;
  45.                       raise_error : boolean = false;
  46.                       Select_Names: boolean = false);
  47.    destructor Destroy; override;
  48.  
  49.    procedure Init;
  50.  
  51.    procedure BuildFont(pFontName : String);
  52.    procedure GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  53.    procedure PrintText(pX,pY : Integer; const pText : String);
  54.    procedure Idle(Sender: TObject; var Done: Boolean);
  55.    procedure FormResize;
  56.    
  57.    procedure ErrorHandler; virtual; abstract;
  58.    procedure run;          virtual; abstract;
  59.    
  60.    property  Frames: integer read fFrames write fFrames;
  61.    property  FPS: single read fFPS write fFPS;
  62.    property  NearClipping: word read fNearClipping write fNearClipping;
  63.    property  FarClipping : word read fFarClipping  write fFarClipping;
  64.    property  ClearColor: TGLClearColor read fClearColor write wClearColor;
  65.    property  LastError: word read fLastError write fLastError;
  66.    property  fovy: single read ffovy write ffovy;
  67.    property  IsSelectNames: boolean read fSelectNames write fSelectNames;
  68.    property  LastHit: integer read fLastHit;
  69.  
  70.    property  OnHit: TNotifyEvent read fHitEvent write fHitEvent;
  71.  end;
  72.  
  73.  EErrorGoToFullScreen = class(exception);
  74.  
  75. resourcestring
  76.  Res_Error_on_FullScreen_Call = 'Konnte Vollbildmodus nicht aktivieren!';
  77.  Res_Error                    = 'Error';
  78.  
  79. const
  80.  No_Error                     =    0;
  81.  Error_on_FullScreen_Call     = 1000;
  82.  
  83. implementation
  84.  
  85. procedure tGL.Init;
  86. begin
  87.  fNearClipping := 1;
  88.  fFarClipping  := 1000;
  89.  fovy          := 45.0;
  90.  
  91.  glClearColor(fClearColor.red, fClearColor.green,
  92.               fClearColor.blue, fClearColor.alpha); // Löschfarbe für Farbpuffer setzen
  93.  
  94.  BuildFont('MS Sans Serif');// Displayfont erstellen
  95.  
  96.  glMatrixMode(GL_PROJECTION); // In die Projektionsmatrix wechseln
  97.  glLoadIdentity;             // Identitätsmatrix laden
  98.  glViewPort(0, 0, fForm.ClientWidth, fForm.ClientHeight); // Viewport an Clientareal des Fensters anpassen
  99.  
  100. end;
  101.  
  102. constructor tGL.create(handle: HWND;
  103.                       const TApp: TApplication;
  104.                       const Form: tForm;
  105.                       fullscreen: boolean  = false;
  106.                       raise_error: boolean = false;
  107.                       Select_Names: boolean = false);
  108. begin
  109.  inherited create;
  110.  fHandle           := handle;
  111.  fForm             := Form;
  112.  fApp              := TApp;
  113.  fraise_error      := raise_error;
  114.  f_if_full_screen  := false;
  115.  fSelectNames      := Select_Names;
  116.  
  117.  fLastError        := No_Error;
  118.  
  119.  // Wenn gewollt, dann hier in den Vollbildmodus wechseln
  120.  // Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
  121.  // Gerätekontext ungültig wird!
  122.  if fullscreen then
  123.   GoToFullscreen(1600, 1200, 32, 75);
  124.  
  125.  InitOpenGL; // OpenGL-Funtionen initialisieren
  126.  
  127.  DC := GetDC(fHandle); // Gerätekontext holen
  128.  
  129.  // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  130.  RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  131.  
  132.  ActivateRenderingContext(DC, RC); // Erstellten Renderkontext aktivieren
  133.  
  134.  glEnable(GL_DEPTH_TEST); // Tiefenpuffer aktivieren
  135.  glEnable(GL_CULL_FACE);  //Backface Culling aktivieren    
  136. //   glEnable(GL_LIGHTING) ;
  137. //   glEnable(GL_COLOR_MATERIAL);
  138. //   glEnable(GL_LIGHT0);
  139.  
  140.  // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
  141.  glDepthFunc(GL_LESS);
  142.  
  143.   // Idleevent für Rendervorgang zuweisen
  144.  fSavedOnIdle := fApp.OnIdle;
  145.  fApp.OnIdle  := Idle;
  146.  
  147.  init; //Initialisierung aufrufen
  148.  
  149.  StartTick := GetTickCount; // Zeitpunkt des Programmstarts für FPS-Messung speichern
  150.  
  151. // if fRaise_error then
  152. //  Case fLastError of
  153. //   Error_on_FullScreen_Call: MessageBox(0, pChar(Res_Error_on_FullScreen_Call),
  154. //                                        pChar(res_error), MB_OK or MB_ICONERROR);
  155. //  end;
  156.  
  157. end;
  158.  
  159. Destructor tGL.Destroy;
  160. begin
  161.  FApp.OnIdle := fSavedOnIdle; //Idle Procedure zurücksetzen
  162.  
  163.  DeactivateRenderingContext; // Renderkontext deaktiveren
  164.  DestroyRenderingContext(RC);
  165.  //wglDeleteContext(RC);       // Renderkontext "befreien"
  166.  ReleaseDC(fHandle, DC); // Erhaltenen Gerätekontext auch wieder freigeben
  167.  
  168.  // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
  169.  if f_if_full_screen then
  170.   ChangeDisplaySettings(devmode(nil^), 0);
  171.  
  172.  inherited destroy;
  173. end;
  174.  
  175. //procedure tGL.ErrorHandler;
  176. //begin
  177. // //  msg.SimpleText := gluErrorString(glGetError);
  178. //end;
  179.  
  180. procedure tGL.FormResize;
  181. begin
  182.  glViewport(0, 0, fForm.ClientWidth, fForm.ClientHeight);
  183.  glMatrixMode(GL_PROJECTION);
  184.  glLoadIdentity;
  185.  gluPerspective(ffovy, fform.ClientWidth / fform.ClientHeight,
  186.                       fNearClipping, fFarClipping);    
  187.  
  188.  glMatrixMode(GL_MODELVIEW);
  189.  glLoadIdentity;
  190. end;
  191.  
  192. procedure tGL.PrintText(pX,pY : Integer; const pText : String);
  193. // =============================================================================
  194. //  Gibt einen Text an Position x/y aus
  195. // =============================================================================
  196. begin
  197.  if pText <> '' then
  198.  begin
  199.   // Tiefentest und Texturierung für Textanzeige deaktivieren
  200.   glDisable(GL_DEPTH_TEST);
  201.   glDisable(GL_TEXTURE_2D);
  202.   // In orthagonale (2D) Ansicht wechseln
  203.   glMatrixMode(GL_PROJECTION);
  204.   glLoadIdentity;
  205.   glOrtho(0,640,480,0, -1,1);
  206.   glMatrixMode(GL_MODELVIEW);
  207.   glLoadIdentity;
  208.  
  209.   glPushAttrib(GL_LIST_BIT);
  210.   glRasterPos2i(pX, pY);
  211.   glListBase(FontBase);
  212.   glCallLists(Length(pText), GL_UNSIGNED_BYTE, pChar(pText));
  213.   glPopAttrib;
  214.  
  215.   glEnable(GL_DEPTH_TEST);
  216.   glEnable(GL_TEXTURE_2D);  
  217.  end;
  218. end;
  219.  
  220. procedure tGL.wClearColor(const Value: TGLClearColor);
  221. begin
  222.  fClearColor := value;
  223.  glClearColor(fClearColor.red,  fClearColor.green,
  224.               fClearColor.blue, fClearColor.alpha);
  225. end;
  226.  
  227. procedure tGL.BuildFont(pFontName : String);
  228. //==============================================================================
  229. //  Displaylisten für Bitmapfont erstellen
  230. // =============================================================================
  231. var
  232.  Font : HFONT;
  233. begin
  234.  FontBase := glGenLists(96); // Displaylisten für 256 Zeichen erstellen
  235.  
  236.  // Fontobjekt erstellen
  237.  Font     := CreateFont(16, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
  238.                         ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
  239.                         ANTIALIASED_QUALITY, FF_DONTCARE or DEFAULT_PITCH,
  240.                         PChar(pFontName));
  241.  
  242.  SelectObject(DC, Font);  // Fontobjekt als aktuell setzen
  243.  wglUseFontBitmaps(DC, 0, 256, FontBase); // Displaylisten erstellen
  244.  DeleteObject(Font) // Fontobjekt wieder freigeben
  245. end;
  246.  
  247. procedure tGL.GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  248. // =============================================================================
  249. //  Wechselt in den mit den Parametern angegebenen Vollbildmodus
  250. // =============================================================================
  251. var
  252.  dmScreenSettings : DevMode;
  253. begin
  254.  // Fenster vor Vollbild vorbereiten
  255.  fForm.BorderStyle    := bsNone;
  256.  fForm.WindowState    := wsMaximized;
  257.  ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  258.  with dmScreenSettings do
  259.  begin
  260.   dmSize              := SizeOf(dmScreenSettings);
  261.   dmPelsWidth         := pWidth;                    // Breite
  262.   dmPelsHeight        := pHeight;                   // Höhe
  263.   dmBitsPerPel        := pBPP;                      // Farbtiefe
  264.   dmDisplayFrequency  := pFrequency;                // Bildwiederholfrequenz
  265.   dmFields            := DM_PELSWIDTH  or DM_PELSHEIGHT
  266.                       or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
  267.  end;
  268.  
  269.  if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
  270.  begin
  271.   f_if_full_screen := false;
  272.   fLastError       := Error_on_FullScreen_Call;
  273.   if fRaise_error then
  274.    raise EErrorGoToFullScreen.Create(Res_Error_on_FullScreen_Call)
  275.  end
  276.  else
  277.  begin
  278.    f_if_full_screen := true;
  279.  end;
  280. end;
  281.  
  282. procedure tGL.Idle(Sender: TObject; var Done: Boolean);
  283. // =============================================================================
  284. //  Hier wird gerendert.
  285. // =============================================================================
  286. var
  287.  SelectBuffer : array[0..1024] of TGLUInt;
  288.  Viewport     : TGLArrayi4;
  289.  Hits,i       : Integer;
  290.  HitZValue    : TGLUInt;
  291.  Hit          : TGLUInt;
  292. begin
  293.  if fSelectNames then //Wenn Selektion aktiv ist
  294.  begin
  295.   glGetIntegerv(GL_VIEWPORT, @viewport);
  296.   glSelectBuffer(1024, @SelectBuffer);
  297.   glMatrixMode(GL_MODELVIEW); //In's Modelview schalten
  298.   glRenderMode(GL_SELECT);
  299.   glInitNames;                //Name Stack Initialisieren
  300.   glPushName(0);              //Default Name einsetzen  
  301.   glMatrixMode(GL_PROJECTION);
  302.   glPushMatrix;
  303.   glLoadIdentity;
  304.   gluPickMatrix(0, 0, fForm.ClientWidth, fForm.ClientHeight, viewport);
  305.   gluPerspective(fovy, fForm.ClientWidth/fForm.ClientHeight,
  306.                        fNearClipping, fFarClipping);
  307.   glRenderMode(GL_RENDER);                    
  308.  end;
  309.  
  310.  glMatrixMode(GL_PROJECTION); // In die Projektionsmatrix wechseln
  311.  glLoadIdentity;             // Identitätsmatrix laden
  312. // glViewPort(0, 0, fForm.ClientWidth, fForm.ClientHeight); // Viewport an Clientareal des Fensters anpassen
  313.  gluPerspective(fovy, fForm.ClientWidth/fForm.ClientHeight,
  314.                       fNearClipping, fFarClipping);// Perspective, FOV und Tiefenreichweite setzen
  315.  glMatrixMode(GL_MODELVIEW);  // In die Modelansichtsmatrix wechseln
  316.  glLoadIdentity;              // Identitätsmatrix laden
  317.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // Farb- und Tiefenpuffer löschen
  318.  
  319.  run; //hier ist die Zeichenroutine
  320.  
  321.  SwapBuffers(DC);  // Hinteren Puffer nach vorne bringen
  322.  
  323.  if fSelectNames then  //Wenn Selektion aktiv ist
  324.  begin
  325.   glMatrixMode(GL_PROJECTION);
  326.   glPopMatrix;
  327.   Hits      := glRenderMode(GL_RENDER);
  328.   Hit       := High(TGLUInt);
  329.   HitZValue := High(TGLUInt);
  330.   for i := 0 to Hits-1 do
  331.    if SelectBuffer[(i*4)+1] < HitZValue then
  332.     begin
  333.     Hit       := SelectBuffer[(i*4)+3];
  334.     HitZValue := SelectBuffer[(i*4)+1];
  335.     end;
  336.   fLastHit := Hit;
  337.   if assigned(onHit) then
  338.    OnHit(sender);
  339.  end
  340.  else
  341.   fLastHit := -1;
  342.  
  343.  inc(fFrames);     // Nummer des gezeichneten Frames erhöhen
  344.  if (GetTickCount - StartTick) >= 1000 then // FPS aktualisieren
  345.  begin
  346.   fFPS       := fFrames/(GetTickCount-StartTick)*1000;
  347.   fFrames    := 0;
  348.   StartTick  := GetTickCount;
  349.  end;
  350.  
  351.  ErrorHandler;
  352.  done := false;
  353. end;
  354.  
  355. end.


dank für euere hilf :)

PS: auch der Textoutput, könnt noch optimierung vertragen... :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 12:12 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Zeile 307.:
Code:
  1. glRenderMode(GL_RENDER);

Du solltest aber im GL_SELECT bleiben. Ansonsten gibt es im Wiki eine Checkliste bzgl. Selektion.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 19:40 
Offline
DGL Member

Registriert: Sa Aug 04, 2007 19:22
Beiträge: 5
danke, für den tipp, aber wenn ich statt

glRenderMode(GL_RENDER);

glRenderMode(GL_SELECT); schreibe, dann zeichnet er mir leider nix mehr...

PS: wo kann ich denn die checkliste finden?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 10, 2007 08:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die Checkliste kannst du dort finden. http://wiki.delphigl.com/index.php/Hintergrundwissen#Checklisten

Aber du machst bei deiner Selektion ein paar Fehler.

Code:
  1. if fSelectNames then //Wenn Selektion aktiv ist
  2.   glSelectBuffer(...)
  3.   glInitNames(...)
  4.   glPushName(...)
  5.  
  6.   gluPickMatrix(...)
  7.   gluPerspective(...)
  8.  
  9.   glRenderMode(GL_RENDER); <<< Das da!!!
  10. end;
  11.  
  12. glMatrixMode(GL_PROJECTION);
  13. glLoadIdentity()
  14. gluPerspective(...)
  15.  
  16. SwapBuffers(DC);


Das "glRenderMode(GL_RENDER)" ist falsch. Damit verlässt du die Selektion augenblicklich wieder.

Das Neusetzen der Ansicht ist auch falsch, da du dadurch deine für die Selektion eingestellte Ansicht wieder überschreist bzw auf die Darstellungsansicht setzen würdest. Was einer Selektion über den gesammten Bildschirm gleich kommt.

Das "SwapBuffers(DC);" ist auch falsch. Denn wenn du eine normale Selektion hättest würdest du nichts zeichnen und damit würde ein leeres Bild gezeichnet werden.

Korrekt müsste es so aussehen. Kein echter Code sondern eher Pseudocode.
Code:
  1. if fSelectNames then begin
  2.   glSelectBuffer(...)
  3.  
  4.   glRenderMode(GL_SELECT)
  5.   glInitNames
  6.   glPushName(...)
  7.  
  8.   glMatrixMode(GL_PROJECTION)
  9.   glPushMatrix
  10.   glLoadIdentity
  11.  
  12.   gluPickMatrix(...)
  13.   gluPerspective(...)
  14.  
  15.   Objekte Zeichnen
  16.  
  17.   // Ansicht zurücksetzen
  18.   glMatrixMode(GL_PROJECTION);
  19.   glPopMatrix;
  20.  
  21.   // Selektion verlassen und Hits auswerten
  22.   Hits := glRenderMode(GL_RENDER);
  23.   ...
  24. end;
  25.  
  26. // Hier noch einmal normal zeichnen
  27.  
  28. SwapBuffers(DC);


Wobei die Selektion an der Stelle aber genau um ein Bild verzögert wäre. Was im Normalfall aber eher ungüstig ist, denn du würdest erst verspätet darauf reagieren etc. Typischerweise würde ich empfehlen, dass du eine die Selektion nicht direkt beim Rendern erledigst sondern es als extra Methode machst um auf das Ergebniss der Selektion auch reagieren zu können.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 10, 2007 08:59 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Aus meiner Sicht einfacher und in einem aktuellen Projekt erfolgreich eingesetzt: Selektion per Farbwahl. Du definierst Dir ein Basis-Objekt, dass die Methode "render" enthält. Hier drinne entscheidest Du Dich, ob Du die Welt gerade für den Nutzer oder für den (ich nenns mal) ColorPicker render willst. Alle davon abgeleiten Objekte müssen von dort an zwei Methoden mitbringen. Ich nannte sie immer "renderColorPicker" und "renderNormal". Es kann sich lohnen die Geometry in einer weiteren Methode "renderObject" zu schreiben, die Du in beiden aufrufst. In der Methode darf dann nur Geometry sein, keine Texturierung oder Farbbelegung. Wieso überhaupt zwei Methoden für beide Modi? Würden beide gleich rendern (was bei vielen Objekten geht), würdest Du keine Möglichkeit haben gesonderte Klickbereiche zu haben, z.B. wenn der klickbare Bereich größer sein soll als das Objekt selbst oder Du Dich im renderNormal dafür entscheidest z.B. einen Schattenwurf einzubauen, der allerdings nicht klickbar sein soll.

Von einer globalen Instanz läßt Du Dir einmalige Farbwerte geben und weist diese dann dem Objekten zu. Vor dem Zeichnen des renderColorPick setzt Du diese Farbe. Nun kannst Du bei einem Mausklick in einen ColorPick-Mode gehen, alle deine Objekte ganz normal rendern lassen, bei der aktuellen Mausposition die Farbe auslesen und danach diese bei der globalen Instanz nachschlagen. Dieses Verfahren hat aus meiner Sicht zwei entscheidende Vorteile. Es ist sehr leicht transparent in eigene Anwendungen einzubauen und es erlaubt ein vorzügliches Debugging, da man die Szene einfach im ColorPick-Mode zeichnen kann, um zu sehen, wie die Klickbereiche aussehen und wie sie sich mit der aktuellen Szene überlagern. Das ganze klingt wesentlich komplizierter als es tatsächlich ist, ist für mich allerdings eine echte Alternative in anbetracht der Tatsache, dass es den Selektion-Mode ab OpenGL3 sowieso nicht mehr geben soll.

Die Anzahl der Objekte mit (256^4)-1 sollten auch locker ausreichen und die Szene untexturiert als reine Geometry nochmal zeichnen schafft jede aktuelle Grafikkarte. Zumal dies nur gemacht werden muss, wenn der Anwender einmal geklickt hat. Für einen Hover-Effekte, der vorraussetzt das man bei jeder Mausbewegung die Szene nochmals zeichnet, kann es auf alten Karten zu kleineren Lags kommen. Dafür ist kostet es dann doch ein wenig. Habe ein solches Verfahren gerade in einem Projekt eingesetzt und hat vorzüglich funktioniert und war für den Einsatzbereich auch sehr performant.... und für die Mahte-Idioten wie mich: kommt ohne eine Zeile Mathe aus ;-)

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 31, 2008 10:36 
Offline
DGL Member

Registriert: Sa Aug 04, 2007 19:22
Beiträge: 5
danke, lossy und Phobeus. hab die ganze selektion herausgenommen...

werd mir mal die color pick geschichte von Phobeus ansehen. kennt jemand 'n kleines code beispiel hierfür? hab nur 3 einträge hier gefunden, die nicht grad was damit zu tun haben...

schönes wochenende
GG


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


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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 15 Queries | GZIP : On ]