我有一个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),这会导致对象在当场快速旋转。我需要以某种方式解决此问题...