如何根据方向/幅度向量和碰撞三角形偏转方向/幅度向量?

时间:2011-01-01 19:17:08

标签: c++ vector graphics 3d geometry

所以,我有一个Triangle-> AABB碰撞算法,我让它返回AABB碰撞的三角形。我希望三角形的3个矢量和运动的方向/幅度可以让我确定一个偏转的矢量,这样当你以一个角度靠墙跑,你移动得更慢,这取决于碰撞的角度,但是沿着一边墙。这将消除粘性碰撞问题,仅在没有碰撞时移动。任何建议或参考将不胜感激!感谢。

2 个答案:

答案 0 :(得分:0)

沿三角形的法线移除速度分量。

这个想法是你可以将运动表示为移动到“三角形”和剩余部分(将在垂直方向上)的部分。如果你只是用剩余部分移动,你将不再通过移动接近三角形(或者更进一步,但在这种情况下你不应该检测到碰撞)。

在伪代码中:

// v := velocity vector of moving object
// p[3] := points that make up the triangle

triangle_normal = cross(p[2]-p[0], p[1]-p[0])
problematic_v = project(v, onto=triangle_normal)
safe_movement = v - problematic_movement

请注意,这有意不会保留运动矢量的大小,因为这样做会让你在直行时非常快速地沿着墙壁滑动。

有关详细信息和一些精美图片,请参阅Gamasutra的Pool Hall Lessons: Fast, Accurate Collision Detection Between Circles or Spheres。你没有使用球体,但你实际上是在做一个完美的塑料(因为你没有弹跳)碰撞。

答案 1 :(得分:0)

首先,我会将幅度/方向转换为矢量(它更方便)。

然后(c ++):

float towards=dot(velocity,norm);  // velocity component into triangle
if(towards<0)                      // is moving into triangle
  velocity-=towards*norm;          // remove component

然后它无法进入三角形。 towards<0可能需要根据您的正常情况进行逆转。有一股弹力推出它也很不错。