23 Nisan 2014 Çarşamba

Ek Kırpma

Ek Kırpma

Görüntüleme hacmini altıya kadar ek kırpma düzlemi (sol, sağ, alt, üst, yakın ve uzak)  tanımlayabilirsiniz. Bu, bir sahnedeki konu dışı nesnelerin çıkarılmasında yararlıdır—örneğin eğer bir nesnenin bir kesit görünüşünü göstermek istiyorsanız.
Her bir düzlem, eşitliğine ait katsayılarla belirtilir: Kırpma düzlemleri modelleme ve görüntüleme dönüşümleri ile otomatik olarak uygun şekilde dönüştürülürler. Kırpma hacmi, görüntüleme hacmi ile ek kırpma düzlemleri tarafından tanımlanan tüm yarım-yerlerin kesişimi haline gelir. otomatik olarak kırpılan poligonların kenarlarının OpenGL tarafından uygun şekilde yeniden yapılandırıldığını aklınızda bulundurun.

Tanımladığınız her bir ek kırpma düzlemini etkinleştirmeniz gerekir:
glEnable(GL_CLIP_PLANEi);
Bir düzlemi şu komutla geçersiz hale getirebilirsiniz:
glDisable(GL_CLIP_PLANEi);
Bazı uygulamalar daha fazlasına izin verebilmelerine rağmen OpenGL’nin tüm uygulamaları  altı kırpma düzlemini desteklemek zorundadır.  Kaç düzlemin desteklendiğini bulmak için GL_MAX_CLIP_PLANES ile birlikte glGetIntegerv() ’yi kullanabilirsiniz.
Not: glClipPlane()komutunun bir sonucu olarak gerçekleştirilen kırpma, kırpıntı koordinatlarında değil göz koordinatlarında yapılır. Bu fark, projeksiyonun matrisinin tekil (yani üç-boyutlu koordinatları iki-boyutlu koordinatlara düzleştiren bir gerçek projeksiyon matrisi) olması durumunda belirgindir. Göz koordinatlarında gerçekleştirilen kırpma, projeksiyon matrisinin tekil olması durumunda bile işlemeye devam eder.
Bir Kırpma Düzlemi Kod Örneği
aşşagıdaki Örnek Clip2 bir kafes çerçeve küreyi, orijinal kürenin 4’te üçünü kesip atan iki kırpma düzlemi ile  clip1 deki  gibi dönüştürür.

Örnek Clip2 İki Kırpma Düzlemli Kafes-çerçeveli Küre: clip.c

void init(void)
{
glClearColor(0.0, 0.0, 0.0,0.0);
glShadeModel(GL_FLAT);
}
void display(void)
{
GLdoubleeqn[4]= {0.0,1.0, 0.0,0.0};
GLdoubleeqn2[4]= {1.0,0.0, 0.0, 0.0};
glClear(GL_COLOR_BUFFER_BIT); 
glColor3f(1.0, 1.0, 1.0);  
 glPushMatrix();  
 glTranslatef(0.0, 0.0, -5.0);
/*                     cliplower half -- y< 0           */  
 glClipPlane(GL_CLIP_PLANE0, eqn); 
  glEnable(GL_CLIP_PLANE0);
/*         clipleft half -- x <0   */
glClipPlane(GL_CLIP_PLANE1, eqn2);
glEnable(GL_CLIP_PLANE1);
glRotatef(90.0,1.0, 0.0, 0.0);  
 glutWireSphere(1.0, 20,16);  
 glPopMatrix();
glFlush();
} 
 void reshape(int w,int h)
{
glViewport(0, 0,(GLsizei) w, (GLsizei) h); 
glMatrixMode(GL_PROJECTION); glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
}
 
 int main(int argc,char** argv)
{
glutInit(&argc,argv); 
 glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB); 
 glutInitWindowSize(500,500);  
 glutInitWindowPosition(100, 100);  
 glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);  
 glutReshapeFunc(reshape);  
 glutMainLoop();
return0;
}

Hiç yorum yok:

Yorum Gönder