2010-11-26 12 views
5

"Üstte" veya 3B bir dünya oluşturulmuş bir 2B arabirim oluşturmamı gerektiren bir proje üzerinde çalışıyorum. Diğer bazı forumlarda, iş için "GluOrtho2D()" yi kullanabileceğinizi ve işiniz bittiğinde GluPerspective'a() dönebileceğinizi okudum. Tek şey, yazdığım test kodum, sadece 2D dünyayı değil, 3 boyutlu dünyayı gösteriyor. Bununla birlikte, 3B oluşturma kodunu devre dışı bıraktığımda, quad olması gereken yerde görünür. Kodu aşağıya yazdığım sadece açık ifadeleri açmak için kodu kısaltdım. Kod, Pyglet kütüphanesi kullanılarak Python'da yazılmıştır.3D openGL dünyasında 2B arabirim oluşturma ile ilgili sorun


sahne başlatma kodu:

glViewport(0, 0, width, height) 
glMatrixMode(GL_PROJECTION) 
glLoadIdentity() 
gluPerspective(60.0, float(width)/height, .1, 10000.) 
glMatrixMode(GL_MODELVIEW) 
glClearDepth(1.0) 
glShadeModel(GL_FLAT) 
glEnable(GL_DEPTH_TEST) 
glDepthFunc(GL_LEQUAL) 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) 

çerçeve oluşturma kodu. builder.buildMap() yapılan çağrı 3D sahneyi oluşturur ve glBegin-glEnd çifti 2 boyutlu dörtlü çizer:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 
stage.set3DMode(window.width, window.height) 
builder.buildMap() 
stage.set2DMode(window.width, window.height) 
glBegin (GL_QUADS) 
glVertex2i(0, 0) 
glVertex2i(0, 200) 
glVertex2i(200, 200) 
glVertex2i(200, 0) 
glEnd() 

stage.set3DMode fonksiyonu:

glDisable(GL_DEPTH_TEST) 
glMatrixMode(GL_PROJECTION) 
glLoadIdentity() 
gluOrtho2D(0, width, 0, height) 
glMatrixMode(GL_MODELVIEW) 

ve stage.set3DMode fonksiyonu :

glEnable(GL_DEPTH_TEST) 
glMatrixMode(GL_PROJECTION) 
glLoadIdentity() 
gluPerspective(60.0, float(width)/float(height), .1, 10000.) 
glMatrixMode(GL_MODELVIEW) 

Umarım birisi benim hatama işaret edebilir! Ve bana yardımcı olduğunuz için teşekkür ederim :)

cevap

3

görünüyor. Hatırlamak için en basit yol, projeksiyon matrisini her değiştirdiğinizde çağırmaktır, GL_MODELVIEW'a geçin ve glLoadIdentity()'u arayın (gerçekten eskiyi korumak istemediğiniz sürece).

+0

Mükemmel! Bu düzeltildi. Çok teşekkür ederim! – Bartvbl

1

ben 2d render için aşağıdaki matrisleri kullanın: Eğer GL_MODELVIEW geçtikten sonra glLoadIdentity() demiyorlar gibi

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, w, h, 0, 0, 1); 
glViewport(0, 0, w, h); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0.375f, 0.375f, 0); 
2

Birçok insan glViewport'u ve benzerini nasıl kullanacaklarını yanlış anladı. Onlar her zaman sadece yanlış olan yeniden şekillendirme geri çağırmasına yerleştirirler.

Her zaman bu ayarlara ihtiyaç duymadan önce, görüntü oluşturma işlevinizdeki tüm kurulumlara her zaman hazır olur. Yani kodu (pesudocode) olmalıdır:

render_scene(): 
    // first clear the whole window 
    glViewport(0, 0, window.width, window.height) 
    glClearDepth(1.0) 
    glClearColor(1., 1., 1., 1.); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 

    glViewport(3Dstuff.x, 3Dstuff.y, 3Dstuff.w, 3Dstuff.h) 
    // maybe also set scissor to clip 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    gluPerspective(60.0, float(width)/height, .1, 10000.) 
    glMatrixMode(GL_MODELVIEW) 
    setup3DstuffModelview() 
    glDepthFunc(...) 
    glEnable(GL_DEPTH_TEST) 
    // other state stuff 
    render3Dstuff() 

    // now the 2D stuff 
    glViewport(2Dstuff.x, 2Dstuff.y, 2Dstuff.w, 2Dstuff.h) 
    // clear depth and stencil -- if you need parts of the 3D depth/stencil 
    // for some algorithm retain it or save and restore by FBO renderbuffers or 
    // glReadPixels, glDrawPixels 
    glClearDepth(1.0) 
    glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 

    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    glOrtho(...) 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() 
    setup2DstuffModelview() 
    glDepthFunc(...) 
    glDisable(GL_DEPTH_TEST) 
    // other state stuff 
    render2Dstuff() 

    // repeat for all the layers you need 

Bu çok önemlidir: OpenGL bir durum motorudur. Belirlenmemiş durum değişikliklerinin gerçekleşmediğini ispatlayamazsanız, her zaman belirli bir geometriyi oluşturmadan önce ihtiyaç duyduğunuz tüm durumları yeniden düzenlersiniz.