OpenGl翻译

时间:2014-04-19 07:48:42

标签: c++ opengl

我正在尝试将一个三角形转换为循环中的固定四边形,并且不知道为什么我的循环运行的次数少于我用于运行循环的条件。而我无法理解的是,我已经给出了在循环中转换三角形的条件,但是在条件满足转换之后,如果循环还剩下一些迭代但没有更多的转换条件满足,则三角形回到它的原来的位置,我期待三角形到它的平移位置。

P.s:我必须申请多个对象但是我只申请三角形。

这是显示功能的代码。

void display(void){

float tr;

for (tr = 0.0; tr<=0.8; tr += 0.1)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();
    glPushMatrix();

    Thread::Sleep(100);

    cout <<tr<<endl;    // checking the loop variable values

    glBegin(GL_QUADS);  // making a fixed quad

    glColor3f(1.0f, 1.0f, 0.0f);
    glVertex3f(-0.5f, 0.0f, 0.0f);


    glColor3f(1.0f, 1.0f, 0.0f);
    glVertex3f(0.5f, 0.0f, 0.0f);

     glColor3f(1.0f, 1.0f, 0.0f);
     glVertex3f(0.5f, -1.0f, 0.0f);

     glColor3f(1.0f, 1.0f, 0.0f);
     glVertex3f(-0.5f, -1.0f, 0.0f);
     glEnd();

         if (tr<=0.5)    //condition to translate the triangle 
         glTranslatef(0.0,-tr, 0.0);


     glBegin(GL_TRIANGLES); //Triangle to be translated

     glColor3f(0.2f, 0.6f, 0.2f);
     glVertex3f(-0.5f, 0.5f, 0.0f);


     glColor3f(0.2f, 0.6f, 0.2f);
     glVertex3f(0.5f, 0.5f, 0.0f);

     glColor3f(0.2f, 0.6f, 0.2f);
     glVertex3f(0.0f, 1.0f, 0.0f);
     glEnd();

     glPopMatrix();


    glFlush();
}
}

1 个答案:

答案 0 :(得分:1)

听起来就像你的代码一样有效,但我相信真正的问题出在其他地方,而且根本与OpenGL无关。它与浮点精度有关。问题在于这个循环:

for (tr = 0.0; tr<=0.8; tr += 0.1)

浮点值以二进制格式表示(大多数计算机上为IEE 754),精度有限。虽然0.1和0.8之类的值可以精确地以十进制浮点格式表示,但它们无法以计算机使用的二进制格式精确表示。这意味着在你的情况下,从0.0开始并添加0.1八次将不会导致0.8。我为你的循环打印出高精度的结果,它以0.80000007的值退出,比你预期的更早一次迭代,因为该值不再是<=近似值0.8。

执行您想要的操作的强大方法是使用如下所示的循环:

for (int i = 0; i <= 8; ++i)
{
    float tr = i * 0.1f;

一个不会引起问题的小项目,但非常相关:您在代码中混合浮点值和双精度值。代码中的常量0.10.8是double值,而您的变量是float。如果混合float和double,则操作将以double形式执行。例如,如果您编写tr += 0.1tr将首先转换为double,然后以双精度添加0.1,并将结果舍入为float。虽然没有直接损害,但这是低效和浪费的。使用浮点运算时,使用浮点常量通常要好得多,在这种情况下可以是0.1f0.8f