Hi,
schon hab ich mein nächstes Problem Ich habe 4 Viewports auf einem RenderingContext und rendere auf jeden die gleiche Szene, nur aus verschiedenen Perpektiven, wenn ich jetzt die Selection durchlaufen lasse, liefert sie erstens immer 3 Treffer, obwohl ich nur 2 Objekte auf dem Namestack habe und zweitens liefert sie diese Treffer _immer_ egal wohin ich klicke.
Die Selection-Funktion hab ich größtenteils aus dem Tutorial von dieser Site geklaut:
Code:
function TViewPort.Select(ax, ay:integer):integer;
Unter RenderScene mach ich folgendes:
eventuelle Tasten mittels GetAsyncKeyState zur kamerasteuerung abfragen
glScissor und glViewport setzen
Kamera setzen
2 Displaylisten und ein paar andere Sachen rendern
und das alles natürlich schön in den richtigen MatrixModes
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Spontan fallen mir da nur zwei Fehlerquellen ein :
- Falscher RC aktiv
- Du setzt in RenderScene die Projektionsmatrix neu, was nicht passieren darf.
Ansonsten sag mal was in ax bzw. ay landet. Die Mauskoordinaten müssen ja relativ zum Ursprung des jeweiligen Viewport-Panels (oder was du nimmst) sein.
Du setzt in RenderScene die Projektionsmatrix neu, was nicht passieren darf.
Meinst du mit glMatrixMode(GL_PROJECTION)? Das könnte der Fehler sein...
Son of Satan hat geschrieben:
Ansonsten sag mal was in ax bzw. ay landet. Die Mauskoordinaten müssen ja relativ zum Ursprung des jeweiligen Viewport-Panels (oder was du nimmst) sein.
ax und ay ist die Mausposition, die mir OnMouseDown des Viewport-Panels ausspuckt, ich denke, die dürften richtig sein...
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Wenn du die Projektionsmatrix in RenderScene veränderst, liegt dein Problem definitiv dort. In deiner Selektion erstellst du dir ja ne Pickingmatrix, die auf die Mausposition zentriert und nur sehr klein ist. Wenn du dann wieder eine Projektionsmatrix in RenderScene setzen tust, wird diese Pickingmatrix natürlich verworfen und die Selektion kann dann nicht mehr funktionieren.
Hm OK,
ich hab jetz die RenderScene mal direkt in die Select-Funktion geschrieben um so viel wie möglich weglassen zu können, jetz bekomm ich aber gar keine Treffer mehr
Vielleicht hab ich auch einen Fehler beim Initialisieren des Namestacks, das hab ich nicht so ganz verstanden:
Code:
procedure CreateDisplayList;
var i:integer;
begin
if DisplayList =0then
begin
i :=1;
while glIsList(i)do
inc(i);
DisplayList := i;
end;
glNewList(DisplayList, GL_COMPILE);
glInitNames;
glPushName(0);
glLoadName(DisplayList);
glBegin(GL_TRIANGLE_STRIP);
.........
glEnd();
glEndList();
end;
Den muss ich doch bei jedem Renderaufruf wieder initialisieren oder hab ich das falsch verstanden?
Hm es funktioniert immer noch nicht, nur wenn ich nahe ranzoome scheint es an bestimmten Stellen zu funktionieren, aber anscheinend auch nur ganz zufällig, die mit der gerenderten Ansicht nix zu tun haben.
Vielleicht is ja doch noch ein Fehler drin
Code:
function TViewPort.Select(ax, ay:integer):integer;
Zur Erklärung:
cPos ist die Kameraposition, cLocal sind die lokalen Koordinatenachsen der Kamera
Rot.X,Rot.Y sind die Verschiebungen bzw. Drehungen die ich mit der Maus steuere
Die DisplayListen sehen folgendermaßen aus:
Code:
procedure CreateDisplayList;
var i:integer;
begin
if DisplayList =0then
begin
i :=1;
while glIsList(i)do
inc(i);
DisplayList := i;
end;
glNewList(DisplayList, GL_COMPILE);
glLoadName(DisplayList);
glBegin(GL_TRIANGLE_STRIP);
..............
glEnd();
glEndList();
end;
Sorry, das ich euch so beanspruche (vor allem Dich, Son of Satan ), aber ich finde nichts, was daran schuld sein könnte
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ob das jetzt zum Fehler führt (der Code sieht i.O.) aus kann ich nicht direkt sagen, aber du machst ein fehlerhaftes glPopMatrix; (vor HitCount := ...). Du hast oben deine Projektionsmatrix auf den Stack gelegt, willst aber unten mit dem glPopMatrix eine Modelansichtsmatrix (da du ja noch in GL_MODELVIEW bist) holen, was im Endeffekt zu nem Stackunterlauf führt, und evtl. dein Problem sein könnte. Du willst dort sicher die Projektionsmatrix die du oben auf den Stack gelegt hast wieder davon runterholen, also musst du auch vor dem glPopMatrix wieder in den korrekten Matrizenmodus schalten.
AAAAH ich hab den Fehler gefunden, er liegt in gluPickMatrix. Ich habe nicht darauf geachtet, dass meine 4 Viewports logischerweise nicht die größe des ganzen RCs haben sondern nur ein Viertel davon, daher muss ich schreiben gluPickMatrix(ax,y+Height+Top-ay,1,1,viewport) Ich weiß, solche Dummheit gehört bestraft, aber bitte net hauen...
Mitglieder in diesem Forum: 0 Mitglieder und 11 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.