c# - 如何在与给定输入向量 3 正交的所有向量中找到最接近给定目标向量的向量 3?
问题描述
假设我有两个幅值非零的输入向量:
Vector3 t;
Vector3 o;
我需要找到归一v
化向量,使得在与 正交的所有归一化向量中o
,v
是最接近此t
“目标”向量的向量。我还需要知道是否t
和o
共线,在这种情况下不存在这样的一个v
。
这种关系的说明:
举一个具体的例子,假设我有一个游戏,玩家偶尔会在环境的表面上看到某个类似指南针的物体。玩家必须将指南针上的指针指向随机放置在游戏世界某处的图片对象。当玩家选择针的位置时,我需要知道玩家的选择距离对象的“真实”方向有多远。
罗盘指针固定绕着世界方向的轴旋转o
(也许这是罗盘的transform.forward
),图中游戏对象的方向是t
。
当t
和o
不正交时,指南针将无法直接指向t
,所以我想知道:如何获得指南针可以指向的最接近的方向,即v
?这样,我可以测量这个目标方向和玩家选择的方向之间的角度。而且,当该角度低于某个阈值时,玩家就成功了。
解决方案
您可以使用矢量叉积来解决此问题。请注意,参数的顺序Vector3.Cross
很重要——参数的顺序不一致会产生意想不到的结果。
t
取和的叉积o
。Vector3 x = Vector3.Cross(t, o);
如果
o
和t
共线,x
则等于Vector3.zero
。if (x == Vector3.zero) { // Handle colinear situation }
否则,
x
将是一个与两者正交的向量,o
因此t
也与 正交v
:else {
现在我们有两个正交于
v
(即o
和x
)的向量,我们可以做另一个叉积来找到一个与 共线的向量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
}
推荐阅读
- mediawiki - 如何在 Windows 10 上为 Mediawiki 配置 Scribunto?
- mql4 - MQL4 EA 在不同图表上通过不同信号开立订单
- python - 将数组列转换为多列 Python
- bash - Jenkins mv:无法重命名:文件存在
- python-3.x - Torch 在 gcloud 上看不到带有深度学习容器的 gpu
- panoramas - 保存从一个图像链接到另一个图像的 pannellum 热点
- python - 将 dict 理解与列表理解相结合以合并 dict 对
- macos - 如何使用 Automator 通过增量编辑文本文件中的变量
- list - 检查二进制向量的字符串是否在特定索引上的元组列表中
- c - 不知道为什么反向单链表末尾多了一个节点