我有一个包含3个分量(X,Y,Z)的Vector,我想找到一个与给定正交的Vector。由于与任何向量正交的向量都是无限的,所以我只需要一个随机的向量即可。
我尝试使用带有点积公式的方程,因为两个正交向量之间的点积始终为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;
}
答案 0 :(得分:0)
有几种方法可以做到这一点。我会提供两个。第一个是使用四元数生成随机向量然后将其旋转到位的单线:
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);
}
以下是关于它们之间差异的一些说明: