我需要将位置为x,y,z的对象平滑插值到一行中的多个3D点

时间:2019-04-17 11:04:40

标签: java animation opengl interpolation opengl-2.0

我有一个3D点的ArrayList,例如:

ArrayList<float[]>

这些点被放置在0,0,0周围的环中。现在我有了生成环的代码,只需向该数组添加24个3D点(360除以15度的增量)。

然后我有了一个3D对象,其位置为x,y,z。 我需要能够在对象的当前位置到数组中的第一个点之间进行插值,然后递增数组,然后再次插值至下一个索引,依此类推,直到最终再次循环到起点为止。 >

我可以进行插值,但是我需要的是使对象从一个3D点平滑移动到另一个位置。我当前的代码意味着3D对象将缓慢移动到第一个点,然后停止,然后移动到下一个点,然后停止,依此类推。创建一个非常 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

0 个答案:

没有答案