【问题标题】:Unity3D angle between vectors/directions on specific axis特定轴上矢量/方向之间的 Unity3D 角度
【发布时间】:2018-08-07 07:02:48
【问题描述】:

我有两个方向,我正在尝试计算特定轴上的角度。派生方向的对象不是静态对象,因此我正在努力研究数学以找出我需要做的事情。

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

这是一个显示我正在寻找的图表:

上面的图片是统一的自上而下的视图,它显示了我想要的角度。

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

本质上,我想知道我需要将红线向左旋转多少(顶视图),以便它与蓝色(顶视图)对齐。

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

这是我另一个问题的通用版本: Leap Motion - Angle of proximal bone to metacarpal (side to side movement)

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

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

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

蓝线沿着掌骨,您的手指在静止位置与掌骨对齐。我要计算的是蓝线和红线之间的角度(用绿线标记)。我无法使用 Vector3.Angle,因为该值还考虑了手指的弯曲。我需要以某种方式将手指的方向“拉平”,因此基本上忽略了弯曲,只看一边到另一边的角度。第二张图有望说明我的意思。

在此图中: 蓝线代表手指的实际方向(取自近端骨 - 指关节到第一个关节) 绿线代表掌骨方向(要比较的方向) 红线代表我想将蓝线“转换”成什么,同时保持它的左右角度(如第一手图所示)。

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

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

【问题讨论】:

  • 如何为每条线创建临时二维向量,使它们在同一平面上,然后使用vector3.angle?
  • 鉴于物体在旋转和移动,我如何确定使用哪个轴?
  • 您的参考平面将是在两个向量之间创建的平面,就好像您将它们投影到一个平面上(如您的图片所示)。为了找到两个向量之间的角度,您首先必须确定该角度所在的平面。
  • 我不确定我明白你的意思。你能提供一个代码示例吗?我将如何确定是否应该从 (x,y)、(x,z) 或 (y,z) 等创建 vector2?
  • 不快!这是相当复杂的数学。我建议查看以下链接或搜索类似内容:Angle between two 3d vectors

标签: unity3d vector rotation quaternions


【解决方案1】:

如果我正确理解您的问题,您需要将两个向量投影到一个平面上。向量目前可能不在那个平面上(你的“弯曲手指”问题),因此你需要将它们“投影”到平面上(想想一棵树在地上投下阴影;树是向量,阴影是投影到地面的“平面”上)。

幸运的是,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 只是垂直的。但如果它涉及到其他一些转换,则需要先定义它。

【讨论】:

  • 我已经更新了这个问题,希望能提供清晰的信息。我尝试过使用手掌法线的负值(即手背的法线),但旋转手时角度值会发生很大变化。
  • 根据您的描述,我认为手掌的正常情况正是您想要的。是的,当您旋转手时,它确实会发生变化,但是无论您如何旋转手指(最上面的指关节)的轴心点都会保持在手掌的那个平面上。
  • 您好,我已按照您的建议使用“ProjectOnPlane”,手掌法线为“planeNormal”,如果手指伸直,它就可以工作。但是,我遇到了一个问题,如果我弯曲手指,我的值会不正确,可能在 160-180 度的范围内。
  • 你是如何构建手指向量的?是从第一个关节到指尖,还是从第一个关节到第二个关节?如果是从第一到指尖,则手指矢量可能指向手腕,这可能会导致 180 度角。如果对两个手指向量 (Vector3.Dot(a, b)) 进行点积,结果是否定的,则向量指向相反的方向。
  • 它从第一个关节到第二个关节,然后从第二个关节到第三个关节。
猜你喜欢
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
相关资源
最近更新 更多