游戏中关于跳跃的函数图像的推导以及应用
2018-01-31 22:26
513 查看
跳跃应该是游戏开发中一个最常见的功能之一,实现的方法也有很多,这里我来讲一个我以前用的一个方法.
正常的跳跃,如果使用物理引擎的话,就直接给一个向上的力就可以了,但是有一些游戏,例如跑酷,角色的移动速度都是越来越快的,而如果还是只给一个向上的力的话,跳跃的距离就会相应的变远,这样肯定是不行的,所以为了让角色能够按照固定的路径来跳跃,我们就需要设计一个函数能够模拟出跳跃的效果。下面我会给出函数的推导过程。
首先从最基础的开始y=x^2,它是这样的
但这个看上去和一点也不像跳跃的路径,我们还需要把它翻转过来,翻转的话我们在前面加上一个负号就可以了,像这样:
这下比较像了,但是从0,0点出发就直接往下掉了,跳跃肯定是要先向上的,我们还需要把它往右上方平移,我们把x^2写成x*x,这样比较方便修改。我们给第一个x减去2,公式变成:y=-(x-2)*x,它长这个样子:
这下看上去就和正常的跳跃差不多了,但是实际游戏中我们还需要调节手感以及和策划同学编辑的关卡对应上,所以我们还需要调节跳跃的距离和高度,我们继续来修改我们的公式,,我们来看一下这个公式:
y=-(x-w)*x;
其中w为一个常数,代表了y>0的部分的长度,即跳跃的距离,高度为(w/2)^2,很明显现在的高度是随着距离的增加而增加的,并不能随意调节,所以我们还需要增加一个参数b,来对y轴进行缩放。像这样:
y=-(x-w)*x*b;
那现在我们应该如何确定我们公式中的b应该取多少呢?
我们假设宽度已知为w,想要的高度为h,则有(w/2)^2*b = h;
可以推导出 b = h/(w/2)^2;
所以我们把公式中的b替换一下:
y=-(x-w)*x*(h/(w/2)^2);
这就是我们的最终公式,其中w代表跳跃的宽度,h代表跳跃的高度。
让我们在项目里试一下看看效果~
创建脚本Test,内容如下:
在场景中创建一个物体,放到0,0点,并添加此脚本,我们来看看效果:
这是w=10,h=2的函数图像
可以看到,这就是我们想要的~~~
关于数学部分的内容很简单,都是初中的学习内容,重要的还是要活学活用。
正常的跳跃,如果使用物理引擎的话,就直接给一个向上的力就可以了,但是有一些游戏,例如跑酷,角色的移动速度都是越来越快的,而如果还是只给一个向上的力的话,跳跃的距离就会相应的变远,这样肯定是不行的,所以为了让角色能够按照固定的路径来跳跃,我们就需要设计一个函数能够模拟出跳跃的效果。下面我会给出函数的推导过程。
首先从最基础的开始y=x^2,它是这样的
但这个看上去和一点也不像跳跃的路径,我们还需要把它翻转过来,翻转的话我们在前面加上一个负号就可以了,像这样:
这下比较像了,但是从0,0点出发就直接往下掉了,跳跃肯定是要先向上的,我们还需要把它往右上方平移,我们把x^2写成x*x,这样比较方便修改。我们给第一个x减去2,公式变成:y=-(x-2)*x,它长这个样子:
这下看上去就和正常的跳跃差不多了,但是实际游戏中我们还需要调节手感以及和策划同学编辑的关卡对应上,所以我们还需要调节跳跃的距离和高度,我们继续来修改我们的公式,,我们来看一下这个公式:
y=-(x-w)*x;
其中w为一个常数,代表了y>0的部分的长度,即跳跃的距离,高度为(w/2)^2,很明显现在的高度是随着距离的增加而增加的,并不能随意调节,所以我们还需要增加一个参数b,来对y轴进行缩放。像这样:
y=-(x-w)*x*b;
那现在我们应该如何确定我们公式中的b应该取多少呢?
我们假设宽度已知为w,想要的高度为h,则有(w/2)^2*b = h;
可以推导出 b = h/(w/2)^2;
所以我们把公式中的b替换一下:
y=-(x-w)*x*(h/(w/2)^2);
这就是我们的最终公式,其中w代表跳跃的宽度,h代表跳跃的高度。
让我们在项目里试一下看看效果~
创建脚本Test,内容如下:
public class Test : MonoBehaviour { const int w = 10; const int h = 2; // Use this for initialization void Start () { } // Update is called once per frame void Update () { float x = transform.position.x + Time.deltaTime; float y = JumpFormula(x); Debug.Log(x + "///" + y); transform.position = new Vector3(x,y,transform.position.z); } float JumpFormula(float x){ return -(x-w)*x*(h/Mathf.Pow((w/2),2)); } }
在场景中创建一个物体,放到0,0点,并添加此脚本,我们来看看效果:
这是w=10,h=2的函数图像
可以看到,这就是我们想要的~~~
关于数学部分的内容很简单,都是初中的学习内容,重要的还是要活学活用。
相关文章推荐
- MATLAB图像函数以及应用(第六章)边界问题
- javascript中bind()函数实现和应用以及多次bind的结果和参数位置的思考
- c语言学习(五)scanf函数应用以及问题
- meanshift算法图解以及在图像聚类、目标跟踪中的应用
- 关于mysql 简单的查询语句 以及常用函数的 总结
- 关于游戏中移动的坐标算法(复习初中的三角函数知识)
- 关于malloc()函数以及free()报heap buffer错误的问题
- Boost关于bind的使用以及函数对象和传递参数的问题
- meanshift算法图解以及在图像聚类、目标跟踪中的应用
- 关于JSON以及JSON在PHP中的应用技巧
- 图像缓冲技术在游戏开发中的应用
- 关于opencv中imshow()函数在VS中调用不显示图像的问题
- jQuery.API源码深入剖析以及应用实现(1) - 核心函数篇
- IOCP以及扩展Windows socket函数应用示例
- JavaScript 学习笔记(1):关于函数、对象以及面向对象
- 关于DUILIB的遮罩,控件穿透以及其应用的分析实践
- 工作手记 关于GetPrivateProfileString函数以及如何即时调试debug以及release版本的程式
- 关于 CreateEvent 和WaitForMultipleObjects以及 WaitForSingleObject 等函数的使用实例
- OC_关于Object-C类的创建以及应用
- 关于图像合成所引申的几个函数