Schnitt von Volumenkörper
-
Hoi,
ich möchte gerne ein Volumenkörper mit einer Schnittebene "kreuzen". Als Testobjekt benutzte ich einfach die Teekanne(sie is doch ein ausgefüllter Volumenkörper oder ? ). Wenn ich nur eine Clipplane nutze bekomm ich nur die Kontur, nach bissle googeln habe ich dann eine Lösung mit Hilfe des Stencil-Buffers gefunden:
glEnable(GL_STENCIL_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); zeichne(); // Enthält die Teekanne glDisable(GL_DEPTH_BUFFER_BIT); // decrement stencil buffer value on front faces glStencilFunc(GL_ALWAYS, 0, 0); glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); glCullFace(GL_FRONT); // render back faces only zeichne(); // increment stencil buffer value on back faces glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); glCullFace(GL_BACK); // render front faces only zeichne(); glClear(GL_DEPTH_BUFFER_BIT); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilFunc(GL_EQUAL, 1, 0); glEnable(GL_CLIP_PLANE0); glDisable(GL_STENCIL_TEST); glClipPlane(GL_CLIP_PLANE0,plane); glEnable(GL_DEPTH_BUFFER_BIT); zeichne();
Nach dem ganzen Code sieht es immer noch genau so aus wie nur mit der Clipebene...
Hoff ich hab mein Problem halbwegs verständlich gemacht.
Würde mich über Tipps freuenMfg
-
du callst wahrscheinlich
glutSolidTeapot(1)
das sollte den Utah tea pot anzeigen. der utah tea pot ist aber kein wasserdichtes solides Objekt. er hat Löcher im Bereich des Deckels und der Rüssel penetriert die Polyone im vorderen Bereich.
also
> sie is doch ein ausgefüllter Volumenkörper oder?nein, ist sie nicht.
-
ok ist mir dann auch aufgefallen das die Kanne nicht ausgefüllt ist. Trotzdem danke.
Eine andere Frage, an was kann es liegen das die Schnittfläche nicht beleuchtet wird? Falsch gesetzte Normalvektoren ?
mfg
-
Deine Schnittebene besteht nun doch nicht aus Dreiecken und Vertices, wieso sollte sie also beleuchtet werden?
-
hmm jetzt wo dus sagst klingt logisch
hätte wer ne idee wie ich das Problem lösen kann. Die Schnittfläche kann beliebig kompliziert sein(also löcher usw).Mfg
-
Naja, du hast ja nun deine Schnittfläche im Stencil Buffer, wenn ich das richtig verstanden hab. Du könntest ein der Schnittebene entsprechendes Quad rendern und mit deinem Stencil Buffer entsprechend zuschneiden...
-
glEnable(GL_CLIP_PLANE0); glClipPlane(GL_CLIP_PLANE0, plane); //****** Rendering the mesh's clip edge *** glEnable(GL_STENCIL_TEST); glClear(GL_STENCIL_BUFFER_BIT); glDisable(GL_DEPTH_TEST); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // first pass: increment stencil buffer value on back faces glStencilFunc(GL_ALWAYS, 0, 0); glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); glCullFace(GL_FRONT); // render back faces only zeichne(); // second pass: decrement stencil buffer value on front faces glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); glCullFace(GL_BACK); // render front faces only zeichne(); glEnable(GL_STENCIL_TEST); glClear(GL_STENCIL_BUFFER_BIT); glDisable(GL_DEPTH_TEST); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // drawing clip planes masked by stencil buffer content glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glEnable(GL_DEPTH_TEST); glDisable(GL_CLIP_PLANE0); glStencilFunc(GL_NOTEQUAL,0, ~0); // stencil test will pass only when stencil buffer value = 0; // (~0 = 0x11...11) glPushMatrix(); glRotatef(90,0,1.0,0); glTranslatef(0.0,-2.0,0); glBegin(GL_QUADS); glVertex3f(-2.0,0,0); glVertex3f(2.0,0,0); glVertex3f(2.0,4.0,0); glVertex3f(-2.0,4.0,0); glEnd(); glPopMatrix(); //****** Rendering mesh ********* glDisable(GL_STENCIL_TEST); glEnable(GL_CLIP_PLANE0); // enabling clip plane again zeichne();
So hatte jetzt versucht ein entsprechend großen Quad zu zeichnen und mim Stencil es zuzuschneiden. Aber iwie macht er net das gewünschte bekomme einfach nur den Quad. Eine idee an was es liegen könnte ? Mfg
-
ok also der
glClear(GL_STENCIL_BUFFER_BIT);
in Zeile 21 muss meiner Meinung nach raus, aber wieso die ganze Sache trotzdem nicht Funktioniert versteh ich trotzdem net. Es kommt mir fast so vor als würde die ganze Stencil geschichte ignoriert den wenn ich an den StencilFunktionen rumschraube ändert sich gar nix.
-
hab was vergessen
/* main */ glutInitDisplayMode(...|GLUT_STENCIL);
Jetzt wird das Quad nicht mehr gezeichnet aber "füllt" auch nix die schnittfläche aus
-
Ok ich habs Prinzipiel hatte es funktionier hatte nur einige Einstellungen vergessen zu setzten.
Nur bei einem Solid klappt es bisher überhaupt nicht und zwar bei der Teekanne, diese wird löchrig gezichnet und vom Licht is auch nix mehr zu sehen jemand ne Idee an was es liegt ?
-
Gast_0025 schrieb:
der utah tea pot ist aber kein wasserdichtes solides Objekt. er hat Löcher im Bereich des Deckels und der Rüssel penetriert die Polyone im vorderen Bereich.