【问题标题】:Direction for 2-dimensional vector only in one axis仅在一个轴上的二维向量的方向
【发布时间】:2020-07-24 17:48:20
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

标签: game-physics physics-engine


【解决方案1】:
  • 仅当 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 }

如果向量有长度(例如 {x:0, y:1} length == 1 为真),您链接到的数学运算 in comments 不会导致除以零。

我建议您误解了链接中的数学。

【讨论】:

  • 经过一番探索,你是 100% 正确的,通过获取向量的大小(长度),我可以用它来“引导”射线。
猜你喜欢
  • 2023-03-04
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多