在opengl中翻译另一个形状内的形状

Posted

技术标签:

【中文标题】在opengl中翻译另一个形状内的形状【英文标题】:translating a shape inside another one in opengl 【发布时间】:2014-09-30 15:32:03 【问题描述】:

我希望能够通过按键盘上的一些键将一个较小的立方体转换成一个较大的立方体。

以下是我的尝试:

最初 x = 0,y = 0,z = 0,origin = 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();



【问题讨论】:

xyz 的值在哪里初始化? 所有zero 并且是全球性的 如果 size 恰好是 1opposite = 1 - size -origin; 将评估为 0 并且没有任何反应 我现在很简单,这样我的尺寸将永远低于1 【参考方案1】:

这段代码有很多问题:

    glPushMatrix() 在没有对应的glPopMatrix() 的情况下被调用。顾名思义,这些调用管理一个矩阵堆栈。每一个push操作都必须匹配一个pop操作,否则栈会很快溢出。要解决此问题,请在 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 以验证它是否真的是您想要的。

【讨论】:

以上是关于在opengl中翻译另一个形状内的形状的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 中绘制形状的标准(常用)方法是啥?

OpenGL形状不渲染

在使用 C++ 在 OpenGL 中移动形状时按时间自动旋转形状

在 OpenGL 中绘制多个形状

在 OpenGL 中移动 3d 形状

在 OpenGL 中绘制 2D 形状的轮廓,同时更改线条粗细