贝塞尔曲线制作跳跃轨迹

来源:互联网 发布:小学英语软件哪个好 编辑:程序博客网 时间:2024/05/22 02:15

最近正在进行的一个项目,需要做一个山羊跳跃的功能,因为起跳点和落地点的坐标都是已知并且不能更改的,于是就排除了使用物理引擎的方法。

一开始考虑的是使用球形插值的方法,代码如下:

jumpTime += 0.07f;
Vector3 center = (start + end) * 0.5f;
center -= new Vector3(0, 1, 0);
Vector3 startPos = start – center;
Vector3 endPos = end – center;
transform.position = Vector3.Slerp(startPos, endPos, jumpTime);
transform.position += center;
if (transform.position == end)
{
jump = false;
jumpTime = 0;
}

但是Vector3.Slerp球形插值获得的曲线过于平滑,弧线顶点取起跳坐标及落地坐标的中间点,导致跳跃动作过于僵硬不够逼真,所以最后还是采用了贝塞尔曲线去制作跳跃曲线。

曲线

贝塞尔曲线,学过图形图像的同学应该都知道。它是依据四个位置任意的点坐标绘制出的一条光滑曲线,而我们现在需要用到的只有三个点,起点,中点,和顶点。

 

一阶贝塞尔曲线(线段):

二阶贝塞尔曲线(抛物线):

三阶贝塞尔曲线:

跳跃曲线是一条抛物线,起点,中点。影响抛物线弧度的则是顶点坐标。我们要使用贝塞尔曲线则只需要套用公式即可:

private Vector3 start;
private Vector3 end;
private Vector3 center;
private bool isJump = false;
private float t = 0;
void Start()
{
start = new Vector3(0, 0, 0);
end = new Vector3(1, 1, 0);
center = new Vector3(0.5f, 3f, 0);
}

void Update()
{
if (Input.GetKeyUp(“d”))
{
isJump = true;
}
if (isJump)
{
t += 0.05f;

this.transform.position = Result(start, end, t);
}

}

public Vector3 Result(Vector3 startPos, Vector3 endPos, float t)
{
if (t > 1)
{
t = 1;
}
return (1 – t) * (1 – t) * startPos + 2 * t * (1 – t) * center + t * t * endPos;
}

这样就可以根据自己的需求去修改顶点坐标,达到策划的要求了。

0 0