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 freuen

    Mfg



  • 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.


Anmelden zum Antworten