我正在开发的游戏中有一个非常基本的物理引擎,介于移动的圆柱形角色和由三角形组成的静态网格之间。预期的行为是让角色在表面上滑动,并且在大多数情况下,它可以正常工作。但是引擎不会区分正面碰撞和侧视碰撞。
我不完全确定我可以提供哪些有用的信息。无论如何,我正在寻找一种数学解决方案,一种确定任意圆柱体和三角形之间“接触角”的方法。我的直觉,或者其他什么,告诉我我需要找到三角形和圆柱体之间的接触点,然后确定该点是在三角形内(使用三角形的常规法线)还是沿着它的一条边(使用角度在接触点和气缸上的某个点之间,我不确定是哪个。),但我确信有更好的解决方案。
根据要求,这里有几个例子。在第一个图像中,一个圆柱体向下移动到一个三角形(在这个例子中,三角形是垂直的,简化为一条线。)我使用公式将速度矢量投影到三角形的平面上Vf = V - N * (dot(V,N))
。这是此类碰撞的预期行为。
在此图像中,圆柱体的轴与三角形的法线平行。在当前实现下,Vf 仍然使用三角形的自然法线确定,这将导致圆柱体开始垂直移动。在预期的行为下,N 将垂直于三角形的碰撞边缘。
但这只是碰撞的两个极端。会有一堆中间人,所以我需要一个更随意的解决方案。
这是我对更多 3D 示例的尝试。我为糟糕的观点道歉。这个三角形中最底部的顶点更靠近“相机”。圆柱体和三角形之间的碰撞点用红色 X 标记。在预期行为下,如果圆柱体直接远离相机移动,它将沿着三角形边缘的长度向左滑动。不会产生垂直运动,因为接触点是沿着圆柱体的,呃,管部分,而不是盖。
在当前行为下,使用三角形的法线。圆柱体将被向上推,就好像滑过三角形的面一样,同时几乎没有阻止运动进入三角形。
我知道这是一个困难的要求,所以我很感激为帮助完善我的问题而提出的建议。