如何定期缩放2D对象?

时间:2014-09-10 19:22:24

标签: c++ opengl

我正在尝试使用可变比例因子,这样每个帧的缩放比例都会改变+或 - .05,从而使动画方面不断增长/缩小。

我的缩放因子(scale_x,scale_y和scale_z)初始化为1.0。我想要发生的是每个渲染帧,每个比例因子将增长或缩小一些固定值(如.05)。理想情况下,首先它应该每帧减去0.05,直到达到固定值,如0.2。然后我希望它再次从0.2增加到1.0。

它应该给人一种随着时间的推移而缩小和成长的幻觉。 我正在努力想出办法来做到这一点。我正在考虑使用某种布尔值" grow"它告诉我是否应该增长(每个因子增加.05),或缩小(从每个因子中减去0.05)。

// These are global vars.
float rotate_x, rotate_y, rotate_z;
float scale_x = 1.0f;
float scale_y = 1.0f;
float scale_z = 1.0f;
...

void update_scale()
{
// what can go here?
}

void animate()
{
// calculate new transformation values
update_rotation();
update_scale();

//apply transformations
glRotatef(rotate_x, 1, 0, 0);
glRotatef(rotate_y, 0, 1, 0);
glRotatef(rotate_z, 0, 0, 1);
glScalef(scale_x, scale_y, scale_z);
}

1 个答案:

答案 0 :(得分:0)

您可以保留一个额外的变量来跟踪您应用于比例因子的当前增量,并在每次达到上限/下限时反转它。

基于几个常数:

const float MIN_SCALE = 0.2f;
const float MAX_SCALE = 1.0f;
const float SCALE_STEP = 0.05f;

然后初始化:

float scaleFact = MAX_SCALE;
float scaleInc = -SCALE_STEP;

然后在每次更新时:

scaleFact += scaleInc;
if (scaleFact < MIN_SCALE + 0.5f * SCALE_STEP) {
    scaleFact = MIN_SCALE;
    scaleInc = SCALE_STEP;
} else if (scaleFact > MAX_SCALE - 0.5f * SCALE_STEP) {
    scaleFact = MAX_SCALE;
    scaleInc = -SCALE_STEP;
}

以上对测试进行了一些调整,以避免比较几乎相等的浮点值。您可以使用整数变量来跟踪进度,并将其乘以得到实际的比例因子,而不是处理可能有问题的浮点数比较。