使对象看起来在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);
}
答案 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()