我正在研究的游戏中有一个非常基本的物理引擎,在移动,圆柱形字符和由三角形组成的静态网格之间。预期的行为是角色在曲面上滑动,在大多数情况下,它可以正常工作。但是引擎没有区分正面碰撞和掠过的碰撞。
我不完全确定我能提供哪些信息会有所帮助。无论如何,我正在寻找一种确定任意圆柱和三角形之间“接触角”的方法。我的直觉或其他什么告诉我,我需要找到三角形和圆柱体之间的接触点,然后确定该点是否在三角形内(使用三角形的正则法线)或沿着其中一条边缘(使用角度)在接触点和圆柱上的某个点之间,我不确定哪个。),但我确信有更好的解决方案。
根据要求,这里有几个例子。在第一个图像中,圆柱体向下朝向三角形移动(在此示例中,三角形是垂直的,简化为直线。)我使用公式Vf = V - N * (dot(V,N))
将速度矢量投影到三角形平面上。这是此类碰撞的预期行为。
在此图像中,圆柱的轴与三角形的法线平行。在当前的实现中,Vf仍然使用三角形的自然法线确定,这将导致圆柱体开始垂直移动。在预期的行为下,N将垂直于三角形的碰撞边缘。
但这些只是碰撞的两个极端。会有一堆中间人,所以我需要一个更随意的解决方案。
这是我尝试更多3D示例。我为糟糕的观点道歉。这个三角形中最底部的顶点更接近“相机”。圆柱体和三角形之间的碰撞点用红色X标记。在预期的行为下,如果圆柱体直接从相机移动,它将沿着三角形边缘的长度向左滑动。不会产生垂直运动,因为接触点沿着圆柱体,管部分,而不是盖子。
在当前行为下,使用三角形的法线。圆柱体将被向上推,就好像在三角形的表面上滑动一样,同时防止移动进入三角形。
我理解这是一个困难的请求,所以我感谢为改进我的问题所提出的建议。
答案 0 :(得分:0)
您正在寻找的可能是边缘碰撞探测器。在刚体碰撞系统中,通常存在两种类型的碰撞:表面碰撞(用于碰撞具有规则表面法线的物体,其中反应法线可以很容易地计算,正如您所指出的那样,通过处理A速度与B曲面法线)和边缘碰撞(A体撞击B体的边缘,无论是盒子,三角形还是其他任何东西)。在这种情况下,问题更复杂,因为很明显,边缘不是一个表面,因此你可以 计算它的正常值所有。通常,它以某种方式近似 - 例如,您可以假设,对于三角形网格,边缘法线是两个边缘三角形的法线之间的平均值。还有其他方法可以处理它,其中一些在这里讨论:
https://code.google.com/p/bullet/downloads/detail?name=CEDEC2011_ErwinCoumans.pdf&can=2&q=
通常,有一个边缘处理阈值,如果在该值的半径内发生碰撞,则认为是边缘碰撞,并进行不同的处理。
请参阅此处的示例: http://www.wildbunny.co.uk/blog/2012/10/31/2d-polygonal-collision-detection-and-internal-edges/
谷歌搜索"内部边缘碰撞"一般来说,学习刚体碰撞/动力学将帮助你自己理解和解决这个问题。