您的位置:首页 > 其它

两物体相对位置、追踪速度方向、朝向等计算方向以及角度

2016-03-04 16:03 435 查看

两物体相对位置、追踪速度方向、朝向等计算方向以及角度

内容全在代码中

using UnityEngine;
using System.Collections;

// 两物体相对位置判断、追踪相对速度方向、朝向等计算方向以及角度

public class Direction : MonoBehaviour {

public Vector3 V1;

public Vector3 V2;

void Start()
{
// 为了方便理解便于计算,将向量在 Y 轴上的偏移量设置为 0
V1 = new Vector3( 3, 0, 4);
V2 = new Vector3( -4, 0, 3);

// 分别取 V1,V2 方向上的 单位向量(只是为了方便下面计算)
V1 = V1.normalized;
V2 = V2.normalized;

// 计算向量 V1,V2 点乘结果
// 即获取 V1,V2夹角余弦    cos(夹角)
float direction = Vector3.Dot(V1, V2);
Debug.LogError("direction : " + direction);

// 夹角方向一般取(0 - 180 度)
// 如果取(0 - 360 度)
// direction >= 0 则夹角在 (0 - 90] 和 [270 - 360] 度之间
// direction < 0 则夹角在 (90 - 270) 度之间
// direction 无法确定具体角度

// 反余弦求V1,V2 夹角的弧度
float rad = Mathf.Acos(direction);
// 再将弧度转换为角度
float deg = rad * Mathf.Rad2Deg;
// 得到的 deg 为 V1,V2 在(0 - 180 度的夹角)还无法确定V1,V2 的相对夹角
// deg 还是无法确定具体角度

// 计算向量 V1, V2 的叉乘结果
// 得到垂直于 V1, V2 的向量, Vector3(0, sin(V1,V2夹角), 0)
// 即 u.y = sin(V1,V2夹角)
Vector3 u = Vector3.Cross(V1, V2);
Debug.LogError("u.y  : " + u.y);

// u.y >= 0 则夹角在 ( 0 - 180] 度之间
// u.y < 0 则夹角在 (180 - 360) 度之间
// u.y 依然无法确定具体角度

// 结合 direction >0 、 u.y > 0 和 deg 的值
// 即可确定 V2 相对于 V1 的夹角
if (u.y >= 0) // (0 - 180]
{
if (direction >= 0)
{
// (0 - 90] 度
}
else
{
// (90 - 180] 度
}
}
else    // (180 - 360]
{
if (direction >= 0)
{
// [270 - 360]
// 360 + (-1)deg
}
else
{
// (180 - 270)
}
}

Debug.LogError(deg);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: