2014-09-30 101 views
0

我希望能夠通過按下鍵盤上的某些按鍵來翻譯較小的多維數據集。在opengl中翻譯另一個形狀內的形狀

下面是我試圖完成這件事:

initialy X = 0,Y = 0,Z = 0,原點= 0,但全球範圍

void key_board(unsigned char key, int xx, int yy){//call back func for the glutKeyboardFunc 
     switch (key){ 
     case 'x': 
      if(origin >= 0 && opposite >= 0){ 
      opposite = 1 - size -origin; 
      x +=opposite; 
      break; 
      } 
     case 'y': 
      if(origin >= 0 && opposite >= 0){ 
      opposite = 1 - size -origin; 
      y +=opposite; 
      break; 
      } 
     case 'z': 
      if(origin >= 0 && opposite >= 0){ 
      opposite = 1 - size -origin; 
      z +=opposite; 
      break; 
      } 
     } 
} 

void solid_cube(double size){//this is the cube i would like to translate within the larger one,only perpendicular translation to the wall of bigger box are allowed 

    glPushMatrix(); 
    glLineWidth(1.7f); 
    glShadeModel(GL_SMOOTH); 
    glColor3f(1.0f,0.0f,1.0f); 
    glTranslatef(x, y, z); 
    glutSolidCube(size); 

    } 

void display(){//display call back func 

    glClear(GL_COLOR_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glShadeModel(GL_SMOOTH); 
    gluPerspective(30.0, 4.0/3.0, 0.1f, 10.0); 
    glFrustum(3.0, 5.0, 3.0, 3.0, 5.0, 10.0); 
    gluLookAt(2.0,0,2.0,0.0,0.0,0.0,1.0,1.0,1.0); 
    glLineWidth(1.7f); 
    glColor3f(0.0f,0.0f,1.0f); 
    glutWireCube(1.0); 
    solid_cube(0.3);//smaller cube to be moved around 
    glutSwapBuffers(); 


} 
+0

「x」,「y」和「z」的值已初始化到什麼位置? – elimad 2014-09-30 15:40:01

+0

所有'零'和全球 – Emma 2014-09-30 15:45:58

+0

如果'大小'恰好是'1','相反= 1 - 大小-origin;'將評估爲'0',什麼也沒有發生 – user1781290 2014-09-30 15:48:20

回答

1

有許多的在此代碼的問題:

  1. glPushMatrix()被稱爲沒有相應的glPopMatrix()。如名稱所示,這些調用管理矩陣堆棧。每操作必須匹配pop操作,否則堆棧會很快溢出。爲了解決這個問題,在solid_cube()函數的末尾添加缺少的呼叫:

    ... 
    glutSolidCube(size); 
    glPopMatrix(); 
    
  2. 兩個gluPerspective()glFrustum()被調用。這兩個調用都有相同的用途。 glFrustum()支持設置一般的觀看平截頭體。 gluPerspective()glFrustum()的簡化便利界面,僅支持對稱視錐。這兩個調用都將新指定的投影矩陣與當前矩陣相乘。所以如果你們兩個都有,你會得到一個投影的投影,這是......你想要的東西。您可以簡單地刪除此代碼中的glFrustum()調用。

  3. 投影矩陣通常應設置在GL_PROJECTION矩陣模式。因此,改造安裝程序調用的順序應該是:

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(30.0, 4.0/3.0, 0.1f, 10.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(2.0,0,2.0,0.0,0.0,0.0,1.0,1.0,1.0); 
    

    這是隻需要一次,所以你也可以將它移動到安裝程序代碼,而不是重複它在每個重新顯示。

gluLookAt()的參數看起來也有些不尋常。他們不是非法的,但你可能還想再次檢查documentation以確認它確實是你想要的。

相關問題