У меня есть ArrayList 3D-точек:
ArrayList<float[]>
Эти точки расположены в кольце около 0,0,0.Прямо сейчас у меня есть код генерации колец, просто добавьте 24 трехмерных точки в этот массив (360, деленных на 15 градусов).
Затем у меня есть трехмерный объект с позициями x, y, z.Мне нужно иметь возможность интерполировать текущую позицию объекта до первой точки в массиве, а затем увеличивать массив и снова интерполировать до следующего индекса и т. Д., Пока он в конце концов не вернется к началу.
У меня работает интерполяция, но мне нужно, чтобы объект плавно и плавно перемещал объект из одной трехмерной точки в другую.Мой текущий код означает, что трехмерный объект будет медленно перемещаться к первой точке, затем останавливаться, затем переходить к следующей, затем останавливаться и так далее.Создание очень janky анимации.
Текущий код здесь:
//If first frame, then set fish to default location
if(frame==0) {
globalFishPosition = animationPath.getCircle_Animation().get(index);
globalFishRotation = animationPath.getCircle_Rotation().get(index);
}
if(animationPath.isValuesClose(globalFishPosition, animationPath.getCircle_Animation().get(index))) {
if(index>=animationPath.getCircle_Animation().size()-1) {
index=0;
}else {
index++;
}
interp = 0.0f;
}else {
interp += 0.0008f;
if(interp >= 1.0f) interp = 0.0f;
//Get the position in the ring
globalFishPosition = new float[]{((1-interp) * globalFishPosition[0] + interp * animationPath.getCircle_Animation().get(index)[0]),
((1-interp) * globalFishPosition[1] + interp * animationPath.getCircle_Animation().get(index)[1]),
((1-interp) * globalFishPosition[2] + interp * animationPath.getCircle_Animation().get(index)[2])};
//Get the rortation in the ring
if(animationPath.getCircle_Rotation().get(index)[0]<=-175) {
globalFishRotation = new float[]{(animationPath.getCircle_Rotation().get(index)[0]*-1),
(animationPath.getCircle_Rotation().get(index)[1]),
(animationPath.getCircle_Rotation().get(index)[2]),
(animationPath.getCircle_Rotation().get(index)[3])};
}else{
globalFishRotation = new float[]{((1-interp) * globalFishRotation[0] + interp * animationPath.getCircle_Rotation().get(index)[0]),
(animationPath.getCircle_Rotation().get(index)[1]),
(animationPath.getCircle_Rotation().get(index)[2]),
(animationPath.getCircle_Rotation().get(index)[3])};
}
}
Редактировать: Как указано в комментарии к этому сообщению, еще одна вещь, которую я действительноНапример, когда объект вращается вокруг кольца, я хочу, чтобы объект всегда был направлен параллой к краю кольца.Мой текущий код означает, что, как только он полностью вращается, он будет интерполировать между отрицательным углом поворота и положительным углом поворота.(-180 до 180), что приводит к тому, что объект быстро делает небольшое вращение на месте.Мне нужно как-то это исправить ...