public class ParabolaPath
{public ParabolaPath(Vector3 start, Vector3 end, float height = 10, float gravity = -9.8f){Init(start, end, height, gravity);}public void Init(Vector3 start, Vector3 end, float height = 10, float gravity = -9.8f){float topY = Mathf.Max(start.y, end.y) + height;float d1 = topY - start.y;float d2 = topY - end.y;float g2 = 2 / -gravity;float t1 = Mathf.Sqrt(g2 * d1);float t2 = Mathf.Sqrt(g2 * d2);float t = t1 + t2;float vX = (end.x - start.x) / t;float vZ = (end.z - start.z) / t;float vY = -gravity * t1;m_start = start;m_end = end;m_gravity = gravity;m_totalTime = t;m_velocityStart = new Vector3(vX, vY, vZ);m_position = m_start;m_time = 0;}public Vector3 start{get { return m_start; }}public Vector3 end{get { return m_end; }}public float totalTime{get { return m_totalTime; }}public Vector3 velocityStart{get { return m_velocityStart; }}public Vector3 position{get { return m_position; }}public Vector3 velocity{get { return GetVelocity(m_time); }}public float time{get { return m_time; }set{value = Mathf.Clamp(value, 0, m_totalTime);m_time = value;m_position = GetPosition(value);}}public Vector3 GetPosition(float time){if (time == 0){return m_start;}if (time == m_totalTime){return m_end;}float dY = 0.5f * m_gravity * time * time;return m_start + m_velocityStart * time + new Vector3(0, dY, 0);}public Vector3 GetVelocity(float time){if (time == 0){return m_velocityStart;}return m_velocityStart + new Vector3(0, m_velocityStart.y + m_gravity * time, 0);}private Vector3 m_start;private Vector3 m_end;private float m_gravity;private float m_totalTime;private Vector3 m_velocityStart;private Vector3 m_position;private float m_time;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!