我正在试着让一个人物跳上一个站在他上面的着陆台。 这里是我用过的公式(一切都是非常自我解释的,除了character_MaxForce
,这个角色可以跳跃的总力量):
deltaPosition = target - character_position; sqrtTerm = Sqrt(2 * -gravity.y * deltaPosition.y + MaxYVelocity * character_MaxForce); time = (MaxYVelocity - sqrtTerm) / gravity.y; speedSq = jumpVelocity.x * jumpVelocity.x + jumpVelocity.z * jumpVelocity.z;
如果speedSq < (character_MaxForce * character_MaxForce)
我们有适当的时间,所以我们可以存储的价值:
jumpVelocity.x = deltaPosition.x / time; jumpVelocity.z = deltaPosition.z / time;
否则我们尝试另一种解决scheme:
time = (MaxYVelocity + sqrtTerm) / gravity.y;
然后存储它:
jumpVelocity.x = deltaPosition.x / time; jumpVelocity.z = deltaPosition.z / time; jumpVelocity.y = MaxYVelocity; rigidbody_velocity = jumpVelocity;
问题在于角色正在从着陆台跳下,或者有时他跳得太远,从未撞到着陆台。
通过比较“x”值,可以知道着陆path是左还是右。 或者你可以简单地计算两个垫之间的默认轨迹。 但是,如果你不想连接跳转和着陆点,那么你可以简单地在跳转点和一个标量(一个乘数)之间指定一个方向vector,这个标量就是角色的一个速度,使得他可以跳到某个方向。 调整标量和方向应该给你正确的轨迹。
默认情况下,轨迹是指使用二次贝塞尔曲线 。 你知道起点(跳板)和终点(着陆板)。 使用永远不会低于最高垫的控制点来定义您的“曲线”。
看看二次方程式,这很简单。 (这只会给你一个曲线)使用“t”跟踪曲线(介于0和1之间)。