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 以下)、別のトリックが必要になります。

方法については、現在のフレームの変換を単純に計算するために、タイマーによって駆動される単純な関数をお勧めします。

ここで使用する簡単な関数の 1 つは ですsin。これは、明確な音波 (= 空気中の振動) も表します。

timeアプリケーションの開始からの秒数 (およびミリ秒を表す分数) を表すdouble/float が与えられた場合

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 に答える