我希望能够通过按键盘上的某些键来将较大的多维数据集转换为较大的多维数据集。

以下是我为完成此操作所做的尝试:

初始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();


}

最佳答案

此代码中存在许多问题:


在没有相应的glPushMatrix()的情况下调用glPopMatrix()。顾名思义,这些调用管理一个矩阵堆栈。每个推操作必须与弹出操作匹配,否则堆栈将快速溢出。要解决此问题,请在solid_cube()函数末尾添加丢失的呼​​叫:

...
glutSolidCube(size);
glPopMatrix();

gluPerspective()glFrustum()都被调用。这两个调用具有相同的目的。 glFrustum()支持设置常规的视锥。 gluPerspective()glFrustum()的简化便捷界面,仅支持对称的视锥。这两个调用都将新指定的投影矩阵与当前矩阵相乘。因此,如果两者兼有,您将获得投影的投影,这不是您想要的。您只需在此代码中删除glFrustum()调用即可。
投影矩阵通常应以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以确认它确实是您想要的。

09-06 11:15