首页 > 解决方案 > 如何在与给定输入向量 3 正交的所有向量中找到最接近给定目标向量的向量 3?

问题描述

假设我有两个幅值非零的输入向量:

Vector3 t;
Vector3 o;

我需要找到归一v化向量,使得在与 正交的所有归一化向量中ov是最接近此t“目标”向量的向量。我还需要知道是否to共线,在这种情况下不存在这样的一个v

这种关系的说明:

在此处输入图像描述

举一个具体的例子,假设我有一个游戏,玩家偶尔会在环境的表面上看到某个类似指南针的物体。玩家必须将指南针上的指针指向随机放置在游戏世界某处的图片对象。当玩家选择针的位置时,我需要知道玩家的选择距离对象的“真实”方向有多远。

罗盘指针固定绕着世界方向的轴旋转o(也许这是罗盘的transform.forward),图中游戏对象的方向是t

to不正交时,指南针将无法直接指向t,所以我想知道:如何获得指南针可以指向的最接近的方向,即v这样,我可以测量这个目标方向和玩家选择的方向之间的角度。而且,当该角度低于某个阈值时,玩家就成功了。

标签: c#unity3dmathvector

解决方案


您可以使用矢量叉积来解决此问题。请注意,参数的顺序Vector3.Cross很重要——参数的顺序不一致会产生意想不到的结果。

  1. t取和的叉积o

    Vector3 x = Vector3.Cross(t, o);
    
  2. 如果ot共线,x则等于Vector3.zero

    if (x == Vector3.zero) 
    {
        // Handle colinear situation
    }
    
  3. 否则,x将是一个与两者正交的向量,o因此t也与 正交v

    else
    {
    
  4. 现在我们有两个正交于v(即ox)的向量,我们可以做另一个叉积来找到一个与 共线的向量v。如果与我们用来计算的叉积相比,我们注意第二个叉积的顺序,x那么第二个叉积的输出也将指向相同的方向v。然后剩下的就是对其进行规范化:

        Vector3 v = Vector3.Cross(o, x).normalized;
    
        // Use v
    }
    

共:

Vector3 x = Vector3.Cross(t, o);

if (x == Vector3.zero) 
{
    // Handle colinear situation
}
else
{
    Vector3 v = Vector3.Cross(o, x).normalized;

    // Use v
}

推荐阅读