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
üç 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();
}
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
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
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