Nun bin ich schon wieder stecken geblieben . Diesmal bei der Slection von 3ds-Models.
Ich versuche gerade ein 3D Schach zu programmieren bei dem ich die einzelne Models anwählen und verschieben (bzw. rotieren) lassen will.
Ich hab mir das Tutorial zur Selection auf dieser Seite mal angeschaut und habe Fragen zu den Folgenden Code Teilen:
Code:
function Selection :integer;
var
Puffer :array[0..256]of GLUInt;
Viewport :array[0..3]ofInteger;
Treffer,i :Integer;
Z_Wert : GLUInt;
Getroffen : GLUInt;
begin
glGetIntegerv(GL_VIEWPORT,@viewport);
glSelectBuffer(256,@Puffer);
glRenderMode(GL_SELECT);
glmatrixmode(gl_projection);
glPushMatrix;
glLoadIdentity;
gluPickMatrix(xs, viewport[3]-ys,1.0,1.0,@viewport);{ Wegen dem @Viewport wollte Delphi mir mein Projekt nicht compilieren und ich konnte mit dem Code nicht experimentieren }
render;// Diese Procedure hab ich nicht, ich render im OnIdle Ereigniss ... doch wie einbinden?
glmatrixmode(gl_projection);
glPopMatrix;
treffer := glRenderMode(GL_RENDER);
Getroffen :=High(GLUInt);
Z_Wert :=High(GLUInt);
for i :=0to Treffer-1do
if Puffer[(i*4)+1] < Z_Wert then
begin
getroffen := Puffer[(i*4)+3];
Z_Wert := Puffer[(i*4)+1];
end;
Result := getroffen;
end;
1.) Wie kann ich die OnIdle Methode aufrufen?
--> ApplicationEventsIdle(nil, true) bzw. false als letzter Paramter funktioniert nicht
2.) Muss ich bevor ich die Models Render glloadname(x) aufrufen oder vor dem Create der Models?
---> und glinitname und glpushname(0) muss ich vor glloadname(x) aufrufen, oder wie?
Ich bin einfach nicht durchgestiegen und hoffe auf verwertbare Antworten von euch
(und bitte nicht lachen ich bin Anfänger )
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
RealTec hat geschrieben:
1.) Wie kann ich die OnIdle Methode aufrufen? --> ApplicationEventsIdle(nil, true) bzw. false als letzter Paramter funktioniert nicht
Delphi-Grundlagen : Der letzte Parameter von ApplicationEventsIdle ist ein sog. Variablenparameter, da kann man nicht einen festen Wert übergeben, sondern die Funktion will eine Variable in die sie etwas hineinschreiben kann.
RealTec hat geschrieben:
2.) Muss ich bevor ich die Models Render glloadname(x) aufrufen oder vor dem Create der Models? ---> und glinitname und glpushname(0) muss ich vor glloadname(x) aufrufen, oder wie?
Selection muss man während des Renderns setzen. Und OpenGL ist eine Statemaschine, der gesetzte Selektionsname wird solange für alle Primitiven verwendet, bis ein anderer gesetzt wird. Und ja, die beiden Sachen (Init und Push) muss man in jedem Frame am Anfang der Selektion aufrufen.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Du darfst logischerweise in deiner Renderprozedur nicht nocheinmal die Matrizen (Modelansicht und Projektion) ändern, da du ja für die Selektion eigene Matrizen hast, die auf einen bestimmten Bildpunkt zielen. Also musst du das eigentliche Rendern der Szene (ohne Setzen der Matrizen) auslagern und nur dass aufrufen, also nicht den Idle-Event in dem die Matrizen verändert werden.
Ich hab jetzt die Renderprocedure (ohne setzen der Matrizen) ausgelagert. Jetzt erkennt er zwar ob ich neben ein Model geklickt hab (-1), aber er kann immernoch nicht unterscheiden auf welches Model ich geklickt hab (bringt immer 1) ...
Edit:// Ungefähr jeder 20. Klick "funktioniert" (auch wenn die anderen genau so gut getroffen haben ^^) ... und sonst kommt immer -1
Ich hab jetzt mal im DGL Wiki nach der Bedeutung der einzelnen Paramtern von gluPerspective gesucht und auch gefunden. DOch das mit dem FOV nicht ganz kapiert. Hab mal eine kleine Zeichnung angefertigt (im Querschnitt) wie ich mir das vorstelle....
Der Punkt in der Mitte soll die Y Achse darstellen und das grün Abgegrenzte den FOV Bereich. (also in diesem Beispiel müsst ich 90 als ersten Parameter angeben)
Stimmt das so?
Dan müsst ich wenn ich die Mitte des Schachbretts auf 0 habe 360° angeben, oder?
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Ich glaub, du hast da ein Verständnis-Problem:
Die Winkel-Angabe in gluPerspective gibt dir an, wie weit du als Betrachter nach links und recht um dich herum etwas wahrnimmst, bei mir is da so um die 90° !? Dieser Wert sollte eigentlich immer gleich bleiben. Hatte mit der Selektion auch schon Probleme, als ich unterschiedliche Werte in Selection und OGL-Init hatte. Das Bild, das OGL dann zum selektieren verwendet schaut dann ganz anders aus, als das, das du siehst. So stelle ich mir das immer vor...
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Ich benutz jetzt die gleiche FVO Einstellung (60°) für Render und Selektion, doch tut sich jetzt gar nichts mehr ... (also immer -1)
Und das ich die Szene verschoben und gedreht hab (bzw. auch die 3ds Mdeols gedreht hab) wird ja beim rendern mit berücksichtigt und muss ich nicht extra angeben?
90° ist bei Quake usw.. Standard. Je nachdem wie weit man vom Monitor entfernt sitzt wäre 60° eigentlich korrekter, aber dann sieht man zu wenig gleichzeitig auf dem Bildschirm. Man muß ja berücksichtigen, dass der Monitor nicht das ganze Gesichtsfeld ausfüllt. Mehr als 180° ist auf normalen Weg nicht zu erreichen, aber es gibt ein Quake1 Mod, dass bis zu 720° rendert. Im Death Match hat man dadurch natürlich einen großen Vorteil.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Wenn du an obigem Code nichts geändert hast, befindest du dich zum Zeitpunkt des Renerns noch in der Projektionsmatrix, was falsch ist. Du musst vor dem Rendern in die Modelansichtsmatrix wechseln. Ansonsten müsste es eigentlich funktionieren.
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Kannst du die Sorces (mit den Libs, die du verwendest) mal posten, bzw mir per Mail schicken, dann schau ich sie mir mal an...
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Mitglieder in diesem Forum: 0 Mitglieder 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.