繁体   English   中英

glRotatef结果在一个wirecube上

[英]glRotatef results on a wirecube

我正在使用rand()函数和x变量和y变量在glRotatef中使用。 兰德工作得很好。 发生的事情是当我在X和Y都得到0值时,立方体通过收缩和膨胀而波动。 我已经尝试了几种方法来确保这不会发生,但唉,我在这里。 这是我正在使用的功能:

void initRandoms()
{
    maxCubes = rand() % (CUBE_HIGH - CUBE_LOW + 1) + CUBE_LOW;
    for (int i = 0; i < maxCubes; i++)
    {
        cubeOrigins[i].x = X_LOW + (float)rand() / (float)RAND_MAX * (X_HIGH - X_LOW);
        cubeOrigins[i].y = Y_LOW + (float)rand() / (float)RAND_MAX * (Y_HIGH - Y_LOW);
        //cubeOrigins[i].z = 
        cubeOrigins[i].size = SIZE_LOW + (double)rand() / (double)RAND_MAX * (SIZE_HIGH - SIZE_LOW);
        cubeOrigins[i].rotateX = rand() % 2;
        cubeOrigins[i].rotateY = rand() % 2;


    }

正如我之前所说,每个立方体将在X轴,Y轴,XY轴上旋转或收缩和膨胀。 这是我需要移除的收缩和膨胀对应于0 = X和0 = Y.我可以有X = 0或Y = 0.我试过的是一些if else条件但是会发生什么是我收缩&膨胀但随后所有立方体都朝同一方向旋转。 我希望有人能弄清楚我做错了什么,并告诉我我需要做什么。 我感谢大家的帮助。 如果需要,我会提供更多代码。

这是myDisplay函数,其中使用了上述函数。 上面的函数也在main中调用:

void myDisplay()
{

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
for(int i = 0; i < maxCubes; i++)
{

    glLoadIdentity();

    glTranslatef(0.0f, 0.0f, -120.0);
    glTranslatef(cubeOrigins[i].x, cubeOrigins[i].y, cubeZ);
    glRotatef(rotateAxis, cubeOrigins[i].rotateX, cubeOrigins[i].rotateY, 0.0f);
    //glRotatef(rotateAxis, 1, 1, 0);

    glutWireCube(cubeOrigins[i].size);
}

cubeZ += 0.050f;
glutSwapBuffers();
glFlush();

if (cubeZ > 120.0f)
{
    cubeZ -= 100.f;
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    for(int i = 0; i < maxCubes; i++)
    {
        initRandoms();
        glLoadIdentity();

        glTranslatef(0.0f, 0.0f, -120.0);
        glTranslatef(cubeOrigins[i].x, cubeOrigins[i].y, cubeZ);
        glRotatef(rotateAxis, cubeOrigins[i].rotateX, cubeOrigins[i].rotateY, 0.0f);
        //glRotatef(rotateAxis, 1, 1, 0);

        glutWireCube(cubeOrigins[i].size);

    }
    cubeZ += 0.050f;
    glutSwapBuffers();
    glFlush();
}
}

查看代码,我可以看到您使用此函数旋转多维数据集:

glRotatef(rotateAxis, cubeOrigins[i].rotateX, cubeOrigins[i].rotateY, 0.0f);

问题是:当cubeOrigins [i] .rotateX和cubeOrigins [i] .rotateY都为零时会发生什么? OpenGL使用名为quaternion的数学函数( http://www.opengl.org/sdk/docs/man2/xhtml/glRotate.xml )旋转矩阵,当x,y和z为零时,我猜(因为你的是违反其中一个前提是|| x,y,z ||必须是1)它被简化为这个矩阵:

|cos(angle)   0       0      0|
|   0   cos(angle)    0      0|
|   0         0   cos(angle) 0|
|   0         0       0      1|

这基本上是一个比例矩阵。 这解释了你之前收缩和膨胀的影响。

因此,正如您之前观察到的那样,您需要避免这种情况。

其次,对于所有立方体,您使用相同的rotateAxis 因此,具有相同cubeOrigins [i] .rotateX和cubeOrigins [i] .rotateY的每个立方体将获得相同的旋转。 你需要在这里得到一些变化(改变每个立方体的rotateAxis)

最后,你不需要同时调用两个:

glutSwapBuffers();
glFlush();

glutSwapBuffers()已经在内部调用glFlush

首先要做的事情

(我不确定你是否已经这样做了)

在使用C rand()方法之前,你需要给它一个种子,这样你就可以使用srand()函数得到“真正的”随机数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM