For循环在Display函数OpenGL中调用的函数中不起作用

时间:2016-02-15 15:14:47

标签: c++ opengl glut

我正在尝试使用cyclinders绘制一个Spherical Cap。我从我的Display函数调用该函数。(显示函数是我的glutDisplayFunc)似乎drawSphericalCap()内的循环不能正常工作。当i = 0时,它只循环一次。我想也许我不能在显示功能之外循环。所以我在显示功能中复制了相同的代码。它也不起作用。

void drawSphericalCap(float shpereRadius, float maxRadius)
{
    float r = shpereRadius;
    float a = maxRadius;
    float h = r - sqrt((r * r) - (a * a));
    //teta + 2 * beta = 180
    float teta = asin(a / r);
    float tanBeta = tan((180 - teta) / 2);
    float numberOfCylinders = a * 10;
    float heightOfEachCylinder = h / (10 * a);
    glColor3f(1.0, 1.0, 1.0);
    int i = 0;
    for (i ; i < numberOfCylinders ; i++){
        cout << i;
        float translateOfEachCylinder =  r - h + (heightOfEachCylinder * i);
        glPushMatrix();
        glMatrixMode(GL_MODELVIEW);
        glTranslatef(0, translateOfEachCylinder, 0);
        glRotatef(90,1.0,0,0);
        glutWireCylinder(a, heightOfEachCylinder, 50, 50);
        glPopMatrix();
        h = h - heightOfEachCylinder;
        a = h * tanBeta;
    }
}
显示功能中的

glPushMatrix();
drawSphericalCap(5,3);
glPopMatrix();

我找不到球形帽的代码,所以我查看了公式,我认为上面的代码可以完成这项工作..当我发现问题时...

1 个答案:

答案 0 :(得分:1)

感谢您的提示.. tan函数取弧度而不是度。 并且循环的问题与tan函数有关。(它返回负数,因此循环在第一次迭代后结束)。 我试过gluCyclinder()而不是glutWireCyclinder(),因为我可以安排圆柱形的顶部和底部半径。 所以我想出了一个几乎让我满意的代码,但有些东西需要纠正。但我不会让自己忙于它。所以最终的SphericalCap()函数是这样的(CAPMULTIPLIER可以更改以获得更好的质量):

#define PI 3.14159265
#define CAPMULTIPLIER 10

void drawSphericalCap(float shpereRadius, float maxRadius)
{
    float r = shpereRadius;
    float a = maxRadius;
    float h = r - sqrt((r * r) - (a * a));
    //teta + 2 * beta = 180
    float teta = asin(a / r);
    float tanBeta = tan((PI - teta) / 2);
    float numberOfCylinders = a * CAPMULTIPLIER;
    float heightOfEachCylinder = h / (10 * a);
    glColor3f(1.0, 1.0, 1.0);
    int i = 0;
    GLUquadricObj *cyclinder;
    cyclinder = gluNewQuadric();
    for (i; i < numberOfCylinders; i++){
        //cout << "i="<<i<< "  height="<<heightOfEachCylinder<<endl;
        float translateOfEachCylinder = r - h;
        float smallRadius = tanBeta * (h - heightOfEachCylinder) ;
        glPushMatrix();
        glTranslatef(0, translateOfEachCylinder, 0);
        glRotatef(-90, 1.0, 0, 0);
        gluCylinder(cyclinder, a, smallRadius, heightOfEachCylinder , 50,5);
        glPopMatrix();
        h = h - heightOfEachCylinder;
        a = smallRadius;
        teta = asin(a / r);
        tanBeta = tan((PI - teta) / 2);
    }
}