2013-06-14 20 views
6

Kullanıcının konumuna göre ekranda bir sahne oluşturabileceğim bir programım var. Kullanıcı pozisyon değiştirdikçe, eksen dışı projeksiyon vermek için frustum değişir. Ben şu tür bir şeyle birlikte daha büyük bir sahneyi dikişi üç farklı ekranlarda çalışmaya tekniğini kullanmak istiyorum:
glFrustum kullanarak dikişli bir sahne oluşturma

enter image description here üç görünüm karşısında işlenen büyük bir gerçek dünya sahnesini düşünün. Üç ekran, sahneyi, kullanıcının ekranına göre her ekranda değişen bir perspektiften göreceği şekilde göstermelidir. Bunu, kullanıcının konumuna göre bir sahne oluşturmak için tek bir ekranla yapabiliyorum, ancak bunun üç ekran üzerinde çalışması için bir yöntem düşünemiyorum.

customCam::project(){ 
pushMatrices(); 
glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
     glFrustum(leftNear.x, rightNear.x, bottomNear.y, topNear.y, _near, _far); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(uPos.x, uPos.y, 0, uPos.x, uPos.y, -1, 0, 1, 0); //neglect z scaling for now. In the main program, it's there 
    glTranslatef(0, 0, uPos.z); 
} 

nasıl sahne gerçek dünyada olduğu gibi sürekli görünüyor öyle bir tarzda üç kesik konisi Stich yapın: Temelde yarattık

sınıf eksen dışı projeksiyon aşağıdakileri yapar? Şimdilik, sınıfın bir kullanıcı bir sahneyi çizer:

cstCam.project(); 
    //draw something here 
popMatriceS(); //which were pushed before glFrustum projection 

DÜZENLEME: Bir kullanıcı için üç kesik koni-piramitler tanımlamak için benim durumda, (aynı tüm ekranlar için accoutn kullanıcı ve ekran köşelerine dikkate alarak

custCam1.project(); 
//draw scene here. eg: two walls at the far left and right screen 
drawWalls(); 
popMatrices(); 
custCam2.project(); 
drawWalls(); 
popMatrices(); 
custCam3.project(); 
drawWalls(); 
popMatrices(); 

void drawWalls(){ 
//Left most corner screen wall 
glBegin(GL_QUADS); 
glVertex3f(-1.5*PHWIDTH, HEIGHT/2, 0); //where PHWIDTH, HEIGHT is the physical width/height of each screen 
glVertex3f(-1.5*PHWIDTH, HEIGHT/2, -50); 
glVertex3f(-1.5*PHWIDTH, -HEIGHT/2, -50); 
glVertex3f(-1.5*PHWIDTH, -HEIGHT/2, 0); 
glEnd(); 

//Right most corner screen wall 
glBegin(GL_QUADS); 
glVertex3f(1.5*PHWIDTH, HEIGHT/2, 0); //where PHWIDTH, HEIGHT is the physical width/height of each screen 
glVertex3f(1.5*PHWIDTH, HEIGHT/2, -50); 
glVertex3f(1.5*PHWIDTH, -HEIGHT/2, -50); 
glVertex3f(1.5*PHWIDTH, -HEIGHT/2, 0); 
glEnd(); 
} 

cevap

1

Bu görünebilir olarak o kadar zor değil: referans çerçevesi), aşağıdaki yaptım. (Üç ekran znear düzeyde yukarıda bakıldığında)

Screens from above

Her ekran znear mesafe x-yönünde 2 birimleri kapsayan kabul aşağıdaki görüntü düşünün. Bu değeri sahnenize bağlı olarak ölçeklendirmeniz gerekebilir.

Y koordinat aralığı, üç ekran için değişmez, çünkü bunlar aynı dikey konumdadır.

Ekranlar için üç farklı projeksiyon matrisine ihtiyacınız var. Ofsetin belirlenmesi oldukça basittir. Eğer şekildeki gibi eleklerin uzayda Kamera konumunu ihtiyaç Tabii

left screen => [-3 - camera.x, -1 - camera.x] 
center screen => [-1 - camera.x, 1 - camera.x] 
right screen => [1 - camera.x, 3 - camera.x] 

: Sadece kamera noktasına farklılıkları gerekir.

Görünüm matrisi isteğe bağlı olabilir, ancak üç ekran için de aynı olmalıdır. Bu kez, sahne alanındaki kamera pozisyonunu gluLookAt'a aktarın.

+0

Başarımı, gerçekleştirebildiğimden biraz daha fazla ayrıntı eklemek için düzenledim. Temel olarak, kullanıcının ekranının tüm köşelerinin ofsetlerini kullanıcının pozisyonundan bulabildim ve daha sonra bu üç ekran için üç farklı projeksiyon matrisini tanımladığım 'cstCam :: project' işlevini kullanabildim. Yukarıdaki düzenlemede yayınladığım kodu kullanarak, ekranımda (üç farklı görünüm) aynı benzetim yapmayı denedim ve şu sonuçları aldım: 1) Kullanıcı üç ekranın ortasında http://i.imgur.com/u9O65G8 .png, 2) Kullanıcı sağa doğru hareket eder: http://i.imgur.com/6bxY0R3.png – user1240679

+0

Gördüğünüz ikinci ekran görüntüsünde, kullanıcı sağa doğru hareket ettiğinde, ilk kameradaki duvar gösterilmeye başlar. ikinci ekranda ve sürekli bir sahne oluşturmaz. Bununla birlikte, emin olmadığım şey, yukarıda yaptığım gibi bu üç sahnede matrisin aynı görünmesini sağlayacak bir şey varsa?Ayrıca, bu durumda, neden her üç için de sadece bir modelview matrisi olması gerektiğine dikkat edemiyorum. Yanınızdan bir açıklama okumak harika olurdu. – user1240679

+0

Sadece bir (model) görünüm matrisi olmalı, sadece bir bakış açısı vardır, göz noktası her üç durumda aynıdır. Görüntüleme yönünüz, ekranların her biri için de aynıdır (ekran düzlemine dik olarak, sadece ekran başına asimetrik bir kesme işlemi yapmanız yeterlidir. Ekran görüntüleriniz bunu doğru yapmadığınızı gösterir ... – derhass

İlgili konular