Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Ich habe mich jetzt nicht genau damit beschäftigt, aber wenn ich die Zeile aus dem Tutorial mit deiner vergleiche, fällt mir auf, dass du beim letzten Parameter den Adressoperator (@) verwendest. Wenn du den weglässt, sollte es gehen.
Gruß mrtrain
Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:35, insgesamt 1-mal geändert.
Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
mrtrain hat geschrieben:
Ich habe mich jetzt nicht genau damit beschäftigt, aber wenn ich die Zeile aus dem Tutorial mit deiner vergleiche, fällt mir auf, dass du beim letzten Parameter den Adressoperator (@) verwendest. Wenn du den weglässt, sollte es gehen.
Gruß mrtrain
nein, das war mir auch bereits aufgefallen und ich hatte das schon probiert, mit dem Ergebnis:
Zitat:
[Pascal Fehler] : E2010 Inkompatible Typen: 'TGLVectori4' und 'Array'
ich habe jetzt gemerkt das es wohl am unterschiedlichen opengl header liegt, im beispiel sourcecode ist der orignal opengl header eingebunden, bei mir der DGLopengl header von hier. wenn ich beide einsetze compiliert er zwar aber es kommt sofort eine access violation. nur den opengl header einsetzen kann ich nicht denn dann fehlen ihm ein haufen befehle...
***EDIT***
ok ich habe jetzt erstmal die definition von Viewport von
Code:
Viewport : array[0..3] of Integer;
in
Code:
Viewport : TGLArrayi4;
geändert... jetzt ist die Fehlermeldung erstmal weg... sobald ich mir den kopf zerbrochen habe wie ich das mit dem Namestack lösen kann (bei mir gibts keine const geometrie von der ich vorher schon die namen wüsste, sondern erst zur laufzeit zuzuladende modelle) kann ich testen ob ich damit selektieren kann oder nicht das wird wohl noch paar stündchen dauern...
Ist "viewport" auch vom Typ TGLVectori4? Wenn das ein Array[0..3] of Integer ist funktioniert es nicht, weil der Compiler nicht versteht, dass beides eigentlich das selbe ist.
Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
Schläfer hat geschrieben:
Ist "viewport" auch vom Typ TGLVectori4? Wenn das ein Array[0..3] of Integer ist funktioniert es nicht, weil der Compiler nicht versteht, dass beides eigentlich das selbe ist.
Edit: mist bischen zu spät
Danke trotzdem
vielleicht kannst du mir ja bei meinem jetzigen problem helfen....
und zwar dieses namens array in dem tutorial, das müsste bei mir dynamisch sein, ich finde aber nichts wie ich bei einem dynamischen array die untere grenze auf -1 setzen kann für das "ins nichts klicken"
Code:
setlow(namen,-1);
gibts leider nicht.
***EDIT*** hat sich erledigt, ich habe zwar gerade keine Ahnung wieso, aber mein Programm macht bereits das was es soll, obwohl ich mir ziemlich sicher war noch nicht fertig zu sein.... aber aus irgendeinem Grund funktioniert es schon...
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
um trotzdem deine Frage noch zu klären: Meiner Meinung nach ist ein dynamisches Array mit -1..x nich möglich. Du könntest aber auch einfach den Namen/Index um eins nach unten rechnen
Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
Also irgendwie habe ich mich wohl total zu früh gefreut... und Stunden später gebe ich auf. in meinem Programm findet er immer genau das Teil das am nächsten zur Kammera steht, ganz egal wie weit ich daneben klicke. eine Besonderheit in meinem Programm im Vergleich zu dem Tutorials ist, dass ich in ein Panel rendere...
deswegen habe ich mir die Tutorials Selektion A und B mal vorgenommen und versucht sie im Panel gerendert zum laufen zu bringen...
ohne wirklichen Erfolg.
Bei dem mit dem Quadrat, dem Dreieck und dem Stern schaffe ich es nur wenn das Panel exakt so groß ist wie die Form, ansonsten treffe ich da, wo die Figuren wohl wären (aber nicht sind) wenn ich auf die Form und nicht das Panel rendern würde. Ich vermute irgendwas läuft beim Viewport kopieren schief... aber ich weiss net was
Bei dem Planetentutorial treffe ich überhaupt nichts mehr wenn ich in ein Panel rendere... ganz gleich wie groß ich das panel mache, auch nicht bei identischen größen.
hier mal der von mir abgeänderte Tutorial Code teil, in dem wohl das mit dem Viewport schief geht...
Code:
function TGLForm.GetSelectBufferHit : Integer;
var
SelectBuffer : array[0..512] of TGLUInt;
Viewport : TGLVectori4; //musste ich ändern schon bevor ich ins panel bin
Hits,i : Integer;
HitZValue : TGLUInt;
Hit : TGLUInt;
begin
// Store our Viewport
glGetIntegerv(GL_VIEWPORT, @viewport);
// Tell OpenGL the size of our select buffer
glSelectBuffer(512, @SelectBuffer);
// Change our render mode to GL_SELECT
glRenderMode(GL_SELECT);
// Init the namestack
glInitNames;
glPushName(0);
glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;
// Zoom the view to one pixel around the mouse position
Hm, ich hab' das mal mit meinem Code verglichen (der funktioniert) aber eigentlich mach' ich das genauso. Hast du mal die Werte in Viewport überprüft ob die auch richtig sind? Wenn die von der größe abweichen die das Panal hat würde das bei gluPerspective nicht funktionieren. Außerdem mx und my. Die müssen natürlich auch relativ zum Panal angegeben werden. Und ich glaub der Viewport müsste dann auch in der Höhe mit dem Panal übereinstimmen. Dann könnte es vielleicht sein, dass der Matrix Mode nicht wieder auf Modelview gesetzt wird?
Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
Schläfer hat geschrieben:
Hm, ich hab' das mal mit meinem Code verglichen (der funktioniert) aber eigentlich mach' ich das genauso. Hast du mal die Werte in Viewport überprüft ob die auch richtig sind? Wenn die von der größe abweichen die das Panal hat würde das bei gluPerspective nicht funktionieren. Außerdem mx und my. Die müssen natürlich auch relativ zum Panal angegeben werden. Und ich glaub der Viewport müsste dann auch in der Höhe mit dem Panal übereinstimmen. Dann könnte es vielleicht sein, dass der Matrix Mode nicht wieder auf Modelview gesetzt wird?
Ansonsten fällt mir da aber nichts ein.
ich weiss ja nicht was in Viewport reingehört wenn ich die 4 integerwerte ausgebe dann steht da 0 0 600 600... und 600x600 ist die größe meines panels. die mauskoordinaten werden aufs panel bezogen zurückgegeben, weil ich sie ja im onclick event vom panel mit x und y hole.
wenn du einen funktionierenden tutorial code hast, wo du in ein panel renderst und trotzdem noch selektieren kannst, wärs echt toll wenn du mir den mal schicken könntest
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
also so gehts jetz bei mir. Ich kann aber auf den 1. Blick auch kein unterschied zu deinem Code festellen. Im Viewport stehen der X-Offset, der Y-Offset, die Breite und die Höhe. Also is (0,0,600,600) schon OK, wenn dein Pannel 600x600 is.
MfG Bergmann
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
Bergmann89 hat geschrieben:
Hey,
also so gehts jetz bei mir. Ich kann aber auf den 1. Blick auch kein unterschied zu deinem Code festellen. Im Viewport stehen der X-Offset, der Y-Offset, die Breite und die Höhe. Also is (0,0,600,600) schon OK, wenn dein Pannel 600x600 is.
panel8.Caption:=inttostr(Gl_modelview_matrix); // da kommt was womit ich nix anfangen kann
panel6.caption:=inttostr(viewport[0])+' '+inttostr(viewport[1])+' '+inttostr(viewport[2])+' '+inttostr(viewport[3]); // da kommt 00600600
panel1.Caption:=inttostr(treffer); // da kommt 0 manchmal im nirvana 1 (obwohl nix zu sehn ist)
for i := 0 to Treffer-1 do
if Puffer[(i*4)+1] < Z_Wert then
begin
getroffen := Puffer[(i*4)+3];
Z_Wert := Puffer[(i*4)+1];
end;
if getroffen=High(GLUInt)
then Result := -1
else Result := getroffen;
end;
was mir aufgefallen ist, ist das ich nur etwas gerendert bekomme wenn ich in meiner render procedure auch nochmal ein glu_perspective habe, ohne gehts nicht. das ist der einige unterschied den ich jetzt zu deinem code finde und ich weiss auch nicht wieso ich die zeile brauch um meine geometrie zu sehen.
hier mal meine render procedure, vielleicht versteht ja hier jemand was ich falsch mache:
Code:
procedure TForm1.Render;
var i:integer;
begin
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
gluPerspective(45.0, Panel2.Height/Panel2.Width, NearClipping, FarClipping); // ohne das seh ich garnix... aber im beispielcode von Bergmann (danke!) brauch er das nicht... warum?
Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
ich weiss garnit wie ich das phänomen das ich nu habe in worte bringen soll
also ich habe jetzt als beispielgeometrie horizontal langes und ein vertikal langes rechteck.
Code:
glcolor3f(0,1,0);
glloadname(viereck);
glbegin(gl_quads);
glvertex3f(0,200,10);
glvertex3f(-10,200,10);
glvertex3f(-10,-200,10);
glvertex3f(-0,-200,10);
glend; // nur zum testen
glcolor3f(0,1,0);
glloadname(viereck2);
glbegin(gl_quads);
glvertex3f(-200,10,10);
glvertex3f(-200,8,10);
glvertex3f(200,8,10);
glvertex3f(200,10,10);
glend;
und jetzt kommts: wenn ich die perspective zeile in meiner rendeprocedure weglasse, dann sehe ich die rechtecke nicht. aber ich kann sie - äh - fühlen? also ich meine wenn ich mit der maus dahinfahre wo sie sein müssten, dann äh... sieht die maus sie? sobald ich die zeile einschalte, dann seh ich zwar die rechtecke aber die maus sieht sie nimmer...
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Schau dir mal deinen Code und den laufenden Code unter dem Gesichtspunkt an, wo und wie oft du gluPerspective aufrufst.
Beim "Selectionsdurchlauf" setzt du die Perspektive doppelt. Allerdings in zwei verschiedenen Matrizen (Perspektiv und Modelview). Ich kann mir vorstellen, dass das Probleme macht.
Dazu mal ein Zitat aus dem Wiki zu "glPerspective":
Zitat:
Wo gehört gluPerspective hin?:
In die Initialisierung des Forumulars um überhaupt eine Projektion zu erhalten. In die Behandlung des OnResize-Events, da die Projektion an die neuen Fenstermaße angepasst werden sollte. In den Render-Code wenn sich innerhalb des Renderdurchgangs die Projektion ändert.
Wo gehört gluPerspective nicht hin?:
In den Render-Code wenn sich die Projektion während des Rendervorgangs nicht ändert.
Deine Perspektive ändert sich nicht. Auch nicht zwischen den Durchläufen. Also raus mit dem Ding und an die Richtige Stelle geschoben.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
das Problem was du jetzt beschrieben hast hört sich ganz danach an, also ob du das alles nur einmal renderst. Du musst einmal normal rendern und einmal die Selektion. Du hast also 2 Renderdurchläufe in einem. Machst du das so, oder versucht du alles in einem zum laufen zu bringen, denn das geht glaub ich nicht. €: hab grad ma bisl mit der gluPerspective-Zeile rum gespielt und die in meinem Code verschoben. Ich kann deinen Fehler fast reproduzieren (mit einem Renderdurchlauf), also wirds wo daran liegen. sag mir wenn ich falsch liege ^^
Mitglieder in diesem Forum: 0 Mitglieder und 7 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.