【问题标题】:How to find a randomic Vector orthogonal to a given Vector如何找到与给定向量正交的随机向量
【发布时间】:2019-08-23 04:39:13
【问题描述】:

我有一个包含 3 个分量 (X,Y,Z) 的向量,我想找到一个与给定向量正交的向量。由于与任何向量正交的向量都是无限的,所以我只需要一个随机的。

我尝试使用带有点积公式的方程,因为两个正交向量之间的点积始终为 0,并且我设法编写了一些代码,该代码仅在给定向量轴对齐时才有效,但是这可能是因为向量的随机分量是 X 和 Y。我真的无法理解这一点。

我在 Unity3D 引擎上编写代码以便能够轻松地对其进行可视化:

Vector3 GenerateOrthogonal(Vector3 normal)
    {
        float x = Random.Range(1f, -1f);
        float y = Random.Range(1f, -1f);

        float total = normal.x * x + normal.y * y;
        float z = -total / -normal.z;

        return new Vector3(x, y, z).normalized;
    }

【问题讨论】:

  • stackoverflow.com/questions/11132681/… 让您找到正交向量 - 只需找到 2 并使用它们的随机线性组合。
  • 考虑正交 a 平面垂直于向量上的点。所以首先你需要原始向量上的一个点。所以第一步是得到一个随机的 X(从零到无穷大),然后在原始向量上求解 Y 和 Z。然后你可以得到一个与第一个向量正交的第二个向量。第二个向量实际上是平面上的任何向量,它在第一个向量上的一点垂直于第一个向量。所以你真的在处理无穷大平方。首先你有一个无穷大原始向量上的点数。然后在垂直于第一个向量的平面上的无限数量的向量。

标签: c# unity3d vector trigonometry orthogonal


【解决方案1】:

有几种方法可以做到这一点。我会提供两个。第一个是使用四元数生成随机向量然后将其旋转到位的单线:

Vector3 RandomTangent(Vector3 vector) {
    return Quaternion.FromToRotation(Vector3.forward, vector) * (Quaternion.AngleAxis(Random.Range(0f, 360f), Vector3.forward) * Vector3.right);
}

第二个更长,数学上更严谨,平台依赖性更小:

Vector3 RandomTangent(Vector3 vector) {
    var normal = vector.normalized;
    var tangent = Vector3.Cross(normal, new Vector3(-normal.z, normal.x, normal.y));
    var bitangent = Vector3.Cross(normal, tangent);
    var angle = Random.Range(-Mathf.PI, Mathf.PI);
    return tangent * Mathf.Sin(angle) + bitangent * Mathf.Cos(angle);
}

以下是关于它们的区别的一些说明:

  • 这两个函数都会生成一个具有均匀分布的随机垂直向量(或“切线”)。
  • 您可以通过获取输入和输出之间的角度来衡量这些函数的准确性。虽然大多数情况下它正好是 90,但有时会有非常小的偏差,主要是由于浮点舍入误差。
  • 虽然这两个函数都不会产生大错误,但第二个函数产生它们的频率要低得多。
  • 初步实验表明这些函数的性能足够接近,更快的函数可能因平台而异。对于标准 Windows 构建,第一个实际上在我的机器上更快,这让我措手不及。
  • 如果您准备假设第二个函数的输入是归一化向量,则可以删除输入的显式归一化并获得性能提升。如果您这样做,然后将非归一化向量传递给它,您仍然会得到一个垂直向量,但它的长度和分布将不再可靠地均匀。
  • 在传递零向量的退化情况下,第一个函数将在 XY 平面上生成随机向量,而第二个函数将传播错误并返回零向量本身。

【讨论】:

  • 非常感谢!你真的帮了我很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2012-05-25
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多