使对象看起来在OpenGL中振动

时间:2013-04-15 17:57:06

标签: opengl glut

使对象看起来在OpenGL中振动的最佳方法是什么? 我有一组立方体,我想以不同的强度“振动”,我假设最好的方法是稍微移动它们的渲染位置。我应该使用计时器来达到这个目的还是有更好的方法? 这是我简单的drawCube函数:

void drawCube(float x, float y, float z, float opacity, float col[], float shake)
{
    glTranslatef(-x, -y, -z);
    glColor4f(col[0], col[1], col[2], opacity);
    glutWireCube(20);
    glTranslatef(x, y, z);
}

2 个答案:

答案 0 :(得分:4)

考虑到振动基本上是一个对我们的眼睛来说太快的运动: 是的,你需要为此移动立方体。

只要您的应用程序以足够高的帧速率运行,这将是有说服力的。 低帧率(~15 fps和更低)你需要其他技巧。

至于怎么做:我建议用一个由计时器驱动的简单函数来简单计算当前帧的平移。

这里使用的一个简单功能是sin,它也代表清晰的声波(=空气中的振动)。

给出一个double / float time,表示自应用程序启动以来的秒数(以及表示毫秒的分数)

void drawCube(float x, float y, float z, float opacity, float col[], float time)
{
    float offset = sin(2.0f * 3.14159265359f * time); // 1 Hz, for more Hz just multiply with higher value than 2.0f
    glTranslatef(-x + offset, -y + offset, -z + offset);
    glColor4f(col[0], col[1], col[2], opacity);
    glutWireCube(20);
    glTranslatef(x, y, z);
}

编辑:这会在原始位置周围的间隔[-1,1]中振动。对于更大的振动,将sin的结果乘以缩放因子。

答案 1 :(得分:1)

个人而言,我会使用rand()或我自己的意图。也许是一个Noise函数。 我会使用该噪声函数来获得[-1,1]范围内的随机或psudo随机偏移。 然后将它乘以你在那里的shake变量。

// returns a "random" value between -1.0f and 1.0f
float Noise()
{
    // make the number
}

void drawCube(float x, float y, float z, float opacity, float col[], float shake)
{
    float x, y, z;
    ox = Noise();
    oy = Noise();
    oz = Noise();

    glPushMatrix();
        glTranslatef( x + (shake * ox), y + (shake * oy), z + (shake * oz) );

        glColor4f(col[0], col[1], col[2], opacity);
        glutWireCube(20);
    glPopMatrix();
}

我可能已注意到我调整过的内容,是我在glPushMatrix()glPopMatrix中添加的内容。它们非常有用,并且会自动反转它们之间的任何内容。

glPushMatrix();
    glTranslatef(1, 1, 1);
    // draw something at the location (1, 1, 1)

    glPushMatrix();
        glTranslatef(2, 2, 2);
        // draw something at the location (3, 3, 3)

    glPopMatrix();
    // draw at the location (1, 1, 1) again
glPopMatrix()