在Unity中找到忽略origin.forward的2个点之间的角度

时间:2018-05-30 17:42:18

标签: unity3d math rotation quaternions

背景:我正在创建一个AR寻宝应用。它很简单,它有一个定位器,告诉你宝藏相对于你的位置。我有相机是起源,宝藏是AR世界的一个对象。

问题:我想根据宝藏在太空中的位置旋转我的箭头。但在2d。基本上,我会忽略相对的前向平面,即camera.forward。

示例:如果相机旋转是默认值,则角度可以计算为atan2(dy,dx)。如果相机正向下看,则角度为atan2(dz,dx)。

我尝试了什么:

Quaternion lookRot = Quaternion.LookRotation(target.transform.position - origin.transform.position);
Quaternion relativeRot = Quaternion.Inverse(origin.transform.rotation) * lookRot;

相对旋转在3d空间中是正确的,但我想将其转换为2d忽略camera.forward平面。因此,即使宝藏在相机的前方或后方,也不应改变角度。

4 个答案:

答案 0 :(得分:3)

enter image description here

好的,所以我希望这是有道理的。您将需要某种if语句来确定您的角色是沿着x,y还是z平面观看。希望图表清楚这些参数是什么,但如果没有。例如,要在“x”平面中查看,y旋转必须介于45°和-45°之间或135°和-135°之间,并且z旋转必须介于45°和-45°之间或之间135°和-135°。

基本上你得到的是一个球体分为六个部分,每个平面有两个部分,角色可以沿着它看。一旦你确定了角色正在观看哪个平面,你就可以通过找到角色与角色之间位置的差异来确定方向。然后使用trig计算角度

答案 1 :(得分:2)

回复旧线程,但是我在同一个问题上苦苦挣扎,发现了一个相对简单的解决方案:

将目标的位置(相对于原点)投影在由相机的前向矢量定义的平面上。然后旋转到投影点:

Vector3 diff = target.transform.position - origin.transform.position;
Vector3 projected = Vector3.ProjectOnPlane(diff, Camera.main.transform.forward);
origin.transform.rotation = Quaternion.LookRotation(projected);

答案 2 :(得分:0)

计算x和y坐标的差异,只需通过另一个对象的transform.x和y坐标的相同过程减去一个对象的transform.x,然后使用Mathf.atan(y的差异/ x中的差异)计算角度。然后将z旋转设置为此角度,并将x和y旋转分配给它们已经存在的旋转。

答案 3 :(得分:0)

事实证明,有一种非常简单的方法来获得目标的相对X和Y.

Vector2 ExtractRelativeXY(Transform origin, Transform target) {
    // Get the absolute look rotation from origin to target.
    Quaternion lookRot = Quaternion.LookRotation(target.transform.position - origin.transform.position);
    // Create a relative look rotation with respect to origin's forward.
    Quaternion relativeRot = Quaternion.Inverse(origin.transform.rotation) * lookRot;
    // Obtain Matrix 4x4 from the rotation.
    Matrix4x4 m = Matrix4x4.Rotate(relativeRot);
    // Get the 3rd column (which is the forward vector of the rotation).
    Vector4 mForward = m.GetColumn(2);
    // Simply extract the x and y.
    return new Vector2(mForward.x, mForward.y);
  }

获得x和y后,根据MBo和Tom的建议,使用angle = atan2(y,x)将其转换为角度。

这是有效的,因为四元数的矩阵分量可以在多个向量中演示。这里有更好的例证https://stackoverflow.com/a/26724912