这个SAT /vector投影代码是怎么回事?

我正在看这里提供的示例XNA SAT碰撞代码:

http://www.xnadevelopment.com/tutorials/rotatedrectanglecollisions/rotatedrectanglecollisions.shtml

看下面的代码:

private int GenerateScalar(Vector2 theRectangleCorner, Vector2 theAxis) { //Using the formula for Vector projection. Take the corner being passed in //and project it onto the given Axis float aNumerator = (theRectangleCorner.X * theAxis.X) + (theRectangleCorner.Y * theAxis.Y); float aDenominator = (theAxis.X * theAxis.X) + (theAxis.Y * theAxis.Y); float aDivisionResult = aNumerator / aDenominator; Vector2 aCornerProjected = new Vector2(aDivisionResult * theAxis.X, aDivisionResult * theAxis.Y); //Now that we have our projected Vector, calculate a scalar of that projection //that can be used to more easily do comparisons float aScalar = (theAxis.X * aCornerProjected.X) + (theAxis.Y * aCornerProjected.Y); return (int)aScalar; } 

我认为我所遇到的问题主要来自将物理概念转换为数据结构。 例如,在代码的前面有一个要使用的轴的计算,并且这些被存储为Vector2 ,并且通过从另一个中减去一个点来find它们,但是这些点也被存储为Vector2 。 所以轴被存储为一个单独的Vector2 斜坡

接下来, vector投影代码产生的Vector2究竟代表什么? 也就是说,我知道它代表投影向量,但是它与Vector2 ,这代表了什么? 一个线上的点?

最后, 标量到底代表了什么? 可以告诉我,你已经得到了投影向量的标量值,但是我在网上find的信息都没有告诉我这个向量的标量。 我没有看到这些vector的角度或大小,所以当涉及到物理学方面的思考时,我有点迷失方向。 如果这个最终的标量计算只是一个点积,那么从这里直接适用于SAT呢? 这是我用来计算重叠的最大/最小值? 我想我只是很难搞清楚在这个特定的上下文中点积代表什么。

很显然,我对基础物理学还不是很了解,但任何解释都将不胜感激。

返回值与aNumerator相同。 我不知道为什么所有额外的代码是需要的。 而且绝对不应该返回为一个int ,应该作为一个浮点数返回。

我将用伪代码重写上面的代码;

 //C is theRectangleCorner //A is theAxis aN = C DOT A; //dot product aD = lengthOfA^2; //lengthsquared aDR = (C dot A) / lengthOfA^2; aCP = ((C dot A) / lengthOfA^2 )*Ax, ((C dot A) / lengthOfA^2)*AY); //Now that we have our projected Vector, calculate a scalar of that projection //that can be used to more easily do comparisons float aScalar = ((C dot A) / lengthOfA^2 )*Ax *Ax + ((C dot A) / lengthOfA^2)*AY*AY); =((C dot A) / lengthOfA^2 )(Ax^2+Ay^2) =((C dot A) / lengthOfA^2 )(lengthOfA^2 ) // 2 length^2 cancel out = C dot A 

不知道这是否使事情更清楚,但它希望显示如何aScalar==aNumerator 。 这可能是The Daily WTF的一个好select。 离奇。

最后的标量是角顶点和轴的点积,表示顶点在轴上的投影。 如果你把这个轴想象成一个数字(就像你在一年级/class上所用的那样)。 点积告诉我们在这个数字线上有多远,投影在哪里。

例如,如果box-a的四个角落投影到一个轴上,您将得到{4.0,5.1,4.5和6.1}的值。 想象一下,三角形b的三个角落投影到同一个轴上,我们得到{6.5,7,6.4}作为我们的三个值。 由于box-a(6.1)的最大值小于tri-b(6.4)的最小值,我们可以看到没有重叠。

一个盒子在一个轴上的投影只是一个轴上数字(或距离)的范围

顺便说一下,我们得到以上的值如下;

 4.0= box-A.corner1 DOT axis 5.1= box-A.corner2 DOT axis 4.5= box-A.corner3 DOT axis 6.1= box-A.corner4 DOT axis 

请注意,点积通常会导致非整数结果,这是所讨论的代码中的第二件怪事(它返回一个int)。

为了回答你的第一个问题,一个轴是一个向量,或者至less可以被认为是SAT的一个向量。