二维向量的方向仅在一个轴上

Direction for 2-dimensional vector only in one axis

我正在开发一个小型物理引擎,但遇到了死胡同。我想要做的是从四边形位置(二维向量)的原点向基于其速度的方向投射光线。四边形的速度也是一个二维向量。

为了获得投射光线的方向,我执行以下操作:

(quad.position + quad.velocity) - quad.position

这将return一个可以用作方向的二维向量。我面临的问题是,当其中一个轴或两个is/are 0时,进行上述数学运算时没有方向。结果将在其轴之一(没有速度的地方)为 0。

我使用这个方向的方式是使用这条射线来检查另一个四边形之间的碰撞。这可以通过计算命中发生的射线的确切“时间”来完成。我通过第二个四边形的位置 - 光线的原点(第一个四边形的位置)/光线方向来做到这一点。显然,当方向轴之一为 0 时,我得到一个 DivideByZero 错误。

我想知道我能做些什么来解决这个问题。我仍然要进行光线投射,但好像它是无限的。或者换句话说,进行光线投射,但是沿着以 0 为方向的轴在一条直线上。当我传递某个任意数字(如 0.00001)时,一切正常,但光线投射稍微偏离了我希望它移动的直线。

我一直在网上查找,但似乎找不到任何有用的东西。

  • 仅当 ALL 分量为零时向量的长度为零,例如 {x:0, y:0, z:0}.

  • 只有当向量的长度为零时,其方向才未定义。

这同样适用于所有维度的向量 2D、3D、4D、...、nD 甚至 1D 向量。

要获取向量的长度(大小),请使用 Pythagorean theorem

例如

vec = {x: 1, y: 1, z: 1}
length = (vec.x ^ 2 + vec.y ^ 2 + vec.z ^ 2) ^ 0.5
// AKA length = sqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z)

// in 2D
vec = {x: 1, y: 1}
length = (vec.x ^ 2 + vec.y ^ 2) ^ 0.5

如果向量的长度为零,则它无法拦截任何内容

vec = {x: 0, y: 0, z: 0}
if (vec.x == 0 && vec.y == 0 && vec.z == 0) { return NO_INTERCEPT }

如果向量有长度,您 link 计算的数学 in comments 不会导致被零除,例如 {x:0, y:1} length == 1 为真。

我建议你误解了 link 中的数学。