2014-04-13 100 views
0

我有一個cube.c程序,它顯示一個可以使用箭頭鍵旋轉的立方體。我想將包含多維數據集的窗口劃分爲多個(比如4個)窗口,以便每個窗口都包含該多維數據集的一部分(右上角,左上角,右下角,左下角),每個部分使用方向鍵以它們應該在單個窗口時的方式響應旋轉。所以,如果我按下右箭頭鍵,立方體應該向右旋轉,並在每個窗口上顯示相應的變化。它可以完成嗎? 這裏是我cube.c如何在同一屏幕上將OpenGL窗口分成多個窗口?

#include <stdio.h> 
#include <stdarg.h> 
#include <math.h> 
#define GL_GLEXT_PROTOTYPES 
#ifdef __APPLE__ 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 

// ---------------------------------------------------------- 
// Function Prototypes 
// ---------------------------------------------------------- 
void display(); 
void specialKeys(); 

// ---------------------------------------------------------- 
// Global Variables 
// ---------------------------------------------------------- 
double rotate_y=0; 
double rotate_x=0; 

// ---------------------------------------------------------- 
// display() Callback function 
// ---------------------------------------------------------- 
void display(){ 

    // Clear screen and Z-buffer 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    // Reset transformations 
    glLoadIdentity(); 


    // Rotate when user changes rotate_x and rotate_y 
    glRotatef(rotate_x, 1.0, 0.0, 0.0); 
    glRotatef(rotate_y, 0.0, 1.0, 0.0); 


    //Multi-colored side - FRONT 
    glBegin(GL_POLYGON); 

    glColor3f(1.0, 0.0, 0.0);  glVertex3f( 0.5, -0.5, -0.5);  // P1 is red 
    glColor3f(0.0, 1.0, 0.0);  glVertex3f( 0.5, 0.5, -0.5);  // P2 is green 
    glColor3f(0.0, 0.0, 1.0);  glVertex3f(-0.5, 0.5, -0.5);  // P3 is blue 
    glColor3f(1.0, 0.0, 1.0);  glVertex3f(-0.5, -0.5, -0.5);  // P4 is purple 

    glEnd(); 

    // White side - BACK 
    glBegin(GL_POLYGON); 
    glColor3f( 1.0, 1.0, 1.0); 
    glVertex3f( 0.5, -0.5, 0.5); 
    glVertex3f( 0.5, 0.5, 0.5); 
    glVertex3f(-0.5, 0.5, 0.5); 
    glVertex3f(-0.5, -0.5, 0.5); 
    glEnd(); 

    // Purple side - RIGHT 
    glBegin(GL_POLYGON); 
    glColor3f( 1.0, 0.0, 1.0); 
    glVertex3f(0.5, -0.5, -0.5); 
    glVertex3f(0.5, 0.5, -0.5); 
    glVertex3f(0.5, 0.5, 0.5); 
    glVertex3f(0.5, -0.5, 0.5); 
    glEnd(); 

    // Green side - LEFT 
    glBegin(GL_POLYGON); 
    glColor3f( 0.0, 1.0, 0.0); 
    glVertex3f(-0.5, -0.5, 0.5); 
    glVertex3f(-0.5, 0.5, 0.5); 
    glVertex3f(-0.5, 0.5, -0.5); 
    glVertex3f(-0.5, -0.5, -0.5); 
    glEnd(); 

    // Blue side - TOP 
    glBegin(GL_POLYGON); 
    glColor3f( 0.0, 0.0, 1.0); 
    glVertex3f( 0.5, 0.5, 0.5); 
    glVertex3f( 0.5, 0.5, -0.5); 
    glVertex3f(-0.5, 0.5, -0.5); 
    glVertex3f(-0.5, 0.5, 0.5); 
    glEnd(); 

    // Red side - BOTTOM 
    glBegin(GL_POLYGON); 
    glColor3f( 1.0, 0.0, 0.0); 
    glVertex3f( 0.5, -0.5, -0.5); 
    glVertex3f( 0.5, -0.5, 0.5); 
    glVertex3f(-0.5, -0.5, 0.5); 
    glVertex3f(-0.5, -0.5, -0.5); 
    glEnd(); 

    glFlush(); 
    glutSwapBuffers(); 

} 

// ---------------------------------------------------------- 
// specialKeys() Callback Function 
// ---------------------------------------------------------- 
void specialKeys(int key, int x, int y) { 

    // Right arrow - increase rotation by 5 degree 
    if (key == GLUT_KEY_RIGHT) 
    rotate_y += 5; 

    // Left arrow - decrease rotation by 5 degree 
    else if (key == GLUT_KEY_LEFT) 
    rotate_y -= 5; 

    else if (key == GLUT_KEY_UP) 
    rotate_x += 5; 

    else if (key == GLUT_KEY_DOWN) 
    rotate_x -= 5; 

    // Request display update 
    glutPostRedisplay(); 

} 

// ---------------------------------------------------------- 
// main() function 
// ---------------------------------------------------------- 
int main(int argc, char* argv[]){ 

    // Initialize GLUT and process user parameters 
    glutInit(&argc,argv); 

    // Request double buffered true color window with Z-buffer 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 

    // Create window 
    glutCreateWindow("Rotating Cube"); 

    // Enable Z-buffer depth test 
    glEnable(GL_DEPTH_TEST); 

    // Callback functions 
    glutDisplayFunc(display); 
    glutSpecialFunc(specialKeys); 

    // Pass control to GLUT for events 
    glutMainLoop(); 

    return 0; 
} 

回答

1

您可以使用libtr

的TR(平鋪渲染庫)是做瓷磚呈現一個OpenGL實用工具庫。平鋪渲染是一種用於以塊(瓦片)生成大圖像的技術。

TR是有記憶效率的;可以在主存儲器中不分配全尺寸圖像緩衝區的情況下生成任意大的圖像文件。

+0

你能告訴我如何使用這兩種'glScissor()'和'glViewport()'這個項目? – alasin

+0

@alasin:編輯。 – genpfault

+0

感謝您的編輯。但我認爲你誤解了這個問題。我不想在不同的窗口上顯示多維數據集的不同面孔。我只是希望顯示立方體的主窗口分成不同的部分。像這樣的東西,但在同一屏幕上:http://www.geeks3d.com/public/jegx/200810/equalizer-0.5.5.jpg – alasin

0

感謝您的編輯。但我認爲你誤解了這個問題。我不想在不同的窗口上顯示多維數據集的不同面孔。我只是希望顯示立方體的主窗口分成不同的部分。事情是這樣的,但在同一屏幕上:geeks3d.com/public/jegx/200810/equalizer-0.5.5.jpg

使用的組成的額外投影后轉型看到有可以achived的影響規模和翻譯。在經典的固定函數GL中,這樣的矩陣可以簡單地與投影矩陣預先相乘。所以你必須確保每個窗口同時顯示與同一個參數相同的場景,只有這個單獨的變換對於每個窗口都是不同的。

你必須建立某種「共視」,這將描述軸alingend矩形應用程序視圖將被延長。然後,您可以將每個窗口描述爲相對於「總視口」的總和軸對齊的矩形。你所要做的就是得到x和y的比例因子,以及翻譯部分。兩者都很容易找到。

在你應該知道的事情是,equalizer在您screenhot是的是分佈式渲染系統,這意味着單獨的顯示由通過網絡連接的分離機(典型值)驅動。總體原則在此設置中保持不變,但「同時渲染相同的東西」部分將變得更加困難。但這些東西超出了OpenGL本身的範圍。像上述均衡器這樣的軟件實際上可以幫助你編寫這樣的應用程