Unity 实现抛物线路径

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;// 利用公式 h = g * t * t / 2 来算出上升阶段的时间float t1 = Mathf.Sqrt(g2 * d1);// 利用公式 h = g * t * t / 2 来算出下降阶段的时间float t2 = Mathf.Sqrt(g2 * d2);// 抛物线运行的总时间float t = t1 + t2;// 计算出在水平方向上的两个轴的移动速度 vX vZ (同时也是水平方向的初始速度)float vX = (end.x - start.x) / t;float vZ = (end.z - start.z) / t;// 计算出竖直方向上的初速度 vYfloat vY = -gravity * t1;// 到这里初始速度的3个分量都计算完毕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;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部