背景:我正在创建一个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平面。因此,即使宝藏在相机的前方或后方,也不应改变角度。
答案 0 :(得分:3)
好的,所以我希望这是有道理的。您将需要某种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。