【发布时间】:2019-01-27 03:23:07
【问题描述】:
我正在尝试创建一些类似蛇的运动,但我无法实现将一个身体部位直接移动到另一个身体部位的算法,依此类推。
我想要一些自动移动的蛇,它由单独的块(球体)组成。这条蛇应该沿着一些路径移动。我用贝塞尔样条生成路径,并且已经实现了一条未来蛇的部分。头部点是通过下一个 api 从样条获得的:
class BezierSpline
{
Vector3 GetPoint(float progress) // 0 to 1
}
比我有 SnakeMovement 脚本
public class SnakeMovement : MonoBehaviour
{
public BezierSpline Path;
public List<Transform> Parts;
public float minDistance = 0.25f;
public float speed = 1;
//.....
void Update()
{
Vector3 position = Path.GetPoint(progress);
Parts.First().localPosition = position;
Parts.First().LookAt(position + Path.GetDirection(progress));
for (int i = 1; i < Parts.Count; i++)
{
Transform curBody = Parts[i];
Transform prevBody = Parts[i - 1];
float dist = Vector3.Distance(prevBody.position, curBody.position);
Vector3 newP = prevBody.position;
newP.y = Parts[0].position.y;
float t = Time.deltaTime * dist / minDistance * curspeed;
curBody.position = Vector3.Slerp(curBody.position, newP, t);
curBody.rotation = Quaternion.Slerp(curBody.rotation, prevBody.rotation, t);
}
//....
}
现在,如果我停止头部移动,所有部件都不会保持距离并继续移动到头部位置。上述算法的另一个问题是零件不完全遵循头部路径。他们可以在转弯时“切入”弯道。 主要思想是让用户/ai 仅控制头部(第一个身体部分),每个后续部分都应该准确地重复头部路径并保持其邻居之间的距离。
【问题讨论】: