1

使物体在 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);
}
4

2 回答 2

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比例因子。

于 2013-04-15T18:23:45.537 回答
1

就个人而言,我会使用rand()或我自己的暗示。也许是噪声函数。我将使用该噪声函数来获得 [-1, 1] 范围内的随机或伪随机偏移。然后乘以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()
于 2013-04-15T18:31:27.080 回答