特定轴上 vectors/directions 之间的 Unity3D 角度

Unity3D angle between vectors/directions on specific axis

我有两个方向,我正在尝试计算特定轴上的角度。派生方向的对象不是静态对象,所以我正在努力让我的头脑围绕数学来计算我需要做什么。

仅供参考,如果需要,我有用于计算方向的起点和终点。

这是一张图表,显示了我正在寻找的内容:

上图是unity的俯视图,显示了我想要的角度。

从上图中可以看出问题,方向不在同一高度,所以我无法使用 vector3.angle 函数,因为它不会给我正确的角度值.

本质上我想知道我需要将红线向左旋转多少(俯视图)才能与蓝线(俯视图)对齐。

我需要这个的原因是因为我试图找到一种方法来从我的跳跃运动传感器获取手指的左右角度。

这是我的另一个问题的通用版本:

如果您需要,它将提供有关问题的更具体信息,并且它有更具体的屏幕截图。

**更新: 重新阅读我的问题后,我发现它不是特别清楚,所以我希望在这里能说得更清楚。我正在尝试根据跳跃运动跟踪数据计算手指的角度。特别是手指相对于掌骨的角度(骨头是手背)。一个简单的方法来证明我的意思是让你左右移动你的食指(即朝向你的拇指然后远离你的拇指)。

我在下面放了两张图来说明这一点。

蓝线沿着您的手指在静止位置对齐的掌骨。我要计算的是蓝线和红线之间的角度(用绿线标记)。我无法使用 Vector3.Angle 因为这个值也考虑了手指的弯曲。我需要某种程度的 'flattening' 手指方向,因此基本上忽略了弯曲,只看左右角度。希望第二张图能说明我的意思。

在此图中: 蓝线表示手指的实际方向(从近端骨骼 - 关节到第一个关节) 绿线代表掌骨方向(要比较的方向) 红线代表我想要 'convert' 蓝线,同时保持左右角度(如第一手图中所示)。

另外值得一提的是,我不能只看 x 和 z 轴,因为这只手会在旋转时移动。

我希望这有助于澄清问题,并真正感谢迄今为止收到的帮助。

如果我对你的问题理解正确,你需要将你的两个向量投影到一个平面上。这些矢量目前可能不在那个平面上(你的 "bent finger" 问题)因此你需要 "project" 它们到平面上(想想一棵树在地面上投下阴影;树是矢量和阴影是在地面 "plane" 上的投影。

幸运的是,Unity3D 提供了一种投影方法(虽然数学并不难)。 Vector3.ProjectOnPlanehttps://docs.unity3d.com/ScriptReference/Vector3.ProjectOnPlane.html

Vector3 a = ...;
Vector3 b = ...;
Vector3 planeNormal = ...;
Vector3 projectionA = Vector3.ProjectOnPlane(a, planeNormal);
Vector3 projectionB = Vector3.ProjectOnPlane(b, planeNormal);
float angle = Vector3.Angle(projectionA, projectionB);

你的问题描述不清楚的是你需要投影到什么平面上?水平面?如果是这样,planeNormal 就是垂直的。但如果它是参考其他一些转换,则需要先定义它。