Как периодически масштабировать 2D объект?

0

Я пытаюсь иметь переменный масштабный коэффициент, поэтому каждый кадр изменяется на + или -.05, что дает ему растущий/уменьшающийся аспект анимации.

Мои масштабные коэффициенты (scale_x, scale_y и scale_z) инициализируются до 1.0. То, что я хочу сделать, это для каждого кадра, каждый масштабный коэффициент будет расти или уменьшаться на некоторое фиксированное значение (например.05). В идеале, сначала он должен продолжать вычитать.05 каждый кадр, пока не достигнет фиксированного значения, например 0,2. Затем я хотел бы, чтобы он снова начал расти с 0,2 до 1,0.

Это должно дать иллюзию сокращения и роста с течением времени. Я изо всех сил пытаюсь найти способ сделать это. Я думал о том, чтобы использовать какое-то булевское значение "расти", которое говорит мне, должен ли я расти (добавлять 0,05 к каждому коэффициенту) или сокращать (вычесть 0,0 из каждого фактора).

// 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);
}
Теги:
opengl

1 ответ

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;
}

Вышеописанное делает некоторые изменения в тестах, чтобы избежать сопоставления значений float, которые почти равны. Вместо того, чтобы иметь дело с возможными проблематичными сравнениями с плавающей запятой, вы можете использовать целочисленную переменную, чтобы отслеживать прогресс и умножать ее, чтобы получить фактический масштабный коэффициент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню