2016-01-04 3 views
0

после создания очень простой анимации с использованием libGDX у меня есть некоторые вопросы, которые я хотел бы уточнить, чтобы убедиться, что я все понимаю, прежде чем начинать с любой другой разработки с большей сложностью.Сомнения о значениях libgdx для 3D-анимации

У меня есть ящик, созданный, как это:

public void createBaseCube(Model modelCube) { 

     ModelBuilder modelBuilder = new ModelBuilder(); 
     modelCube = modelBuilder.createBox(1f, 1f, 1f, 
       new Material(ColorAttribute.createDiffuse(Color.GREEN)), 
       VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal); 

     this.cubeInstance.transform.translate(0.5f, 0.5f, 0.5f); 

    } 

Как центрируется в положении (0,0,0) и хотите его углу, чтобы выделить в (0, 0, 0) Я применил перевод в последней строке.

Вот как это выглядит (я добавил набор плитки, чтобы иметь некоторые ссылки):

first box status

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

public class CubeAnimation { 
    ... 
    <<definition of attributes>> 
    ... 
    public CubeAnimation (ModelInstance cubeModel, float fromAngle, float toAngle, float speed, float alpha){ 

     this.cubeInstance = cubeModel; 
     this.fromAngle = fromAngle; //value set to 0 
     this.toAngle = toAngle;  //value set to 90f 
     this.speed = speed;   //value set to 1f 
     this.alpha = alpha;   //value set to 0 
    } 

    public void update(float delta) { 
      alpha += delta * speed; 
      if (alpha >= 1f) { 
       finished =true; 
       return; 
      } 
      float angle = alpha * (toAngle - fromAngle); 
      fromAngle = angle; 

      Vector3 t = new Vector3(0.5f, -0.5f, 0); 
      cubeInstance.transform.idt().translate(t).rotate(Vector3.Z, -angle).translate(t.scl(-1)); 
     } 

Все вроде бы хорошо, и коды достаточно просты, но (и здесь являются проблемы) при применении анимации окно снова переводится в центр (поэтому первый перевод, когда был создан флажок, был отменен), и -surprise- хотя я передаю 90f как параметр анимации, куб поворачивается только на 45 градусов (когда Я установил 180, он повернулся так, как ожидалось: 90).

Вот как это выглядит после анимации:

enter image description here

Что здесь не так? Заранее спасибо за вашу помощь!

+0

Попробуйте удалить строку 'fromAngle = angle;' У меня есть подозрение, что для этого нужно правильно менять только «альфа». – flakes

+0

Thumbs up !! Это решило вопрос о настройке 90f, но только вращение 45f! Благодаря!! : D –

+0

Он все еще ожидает, что один о переводе, который отменен ...: _ ( –

ответ

1

Вы хотите повернуть куб от угла fromAngle до угла toAngle

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

alpha += delta * speed; 
if (alpha >= 1f) { 
    finished =true; 
    return; 
} 

Эта часть подходит для вычисления процента в виде угловой скорости, умноженной на время. т.е.

angle_percentage/seconds * seconds_passed 

Затем вы получите расстояние между начальной и конечной углы в этой линии

float angle = alpha * (toAngle - fromAngle); 

Этот код работает для исходного угла 0, но будет терпеть неудачу для ненулевых начальных точек. Уравнение для линии y = mx + b, так, чтобы исправить это, вы должны включать в себя b значение:

float angle = fromAngle + alpha * (toAngle - fromAngle); 

Это запустит анимацию на fromAngle и толкать его на нужное расстояние.

Дополнительная строка fromAngle = angle; изменяет исходное местоположение на каждой итерации, поэтому вы получаете непредсказуемую анимацию, которая будет отличаться в зависимости от скорости, которую вы выберете ... Я достаточно уверен, что коэффициент два - это просто совпадение;)

Наконец, этот цикл заканчивается, когда значение установлено на 100%, но никогда не обновляется до 100%. Попробуйте это вместо этого.

public void update(float delta) { 
    alpha += delta * speed; 
    if (alpha <= 1f) { 
     float angle = fromAngle + alpha * (toAngle - fromAngle); 

     Vector3 t = new Vector3(0.5f, -0.5f, 0); 
     cubeInstance.transform.idt().translate(t).rotate(Vector3.Z, -angle).translate(t.scl(-1)); 
    } else { 
     finished = true; 
    } 
} 
Смежные вопросы