Мне нужно плавно интерполировать объект с позициями x, y, z на несколько трехмерных точек подряд - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть 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), что приводит к тому, что объект быстро делает небольшое вращение на месте.Мне нужно как-то это исправить ... enter image description here

...