角度范围检测方法之二

https://www.jianshu.com/p/20e0c875491a/
这篇文章介绍了三种方法,分别用Quaternion.Angle,Vector3.Angle,Vector3.dot
` //旋转角度
private void GetAngleA()
{
Vector3 targetDir = target.position - transform.position;
Quaternion roation = Quaternion.LookRotation(targetDir);
float angle = Quaternion.Angle(transform.rotation, roation);
print("角度(quaternaion)A:" + angle);
}

//旋转角度
private void GetAngleB()
{
    Vector3 targetDir = target.position - transform.position;
    //lhs   rhs
    float angle = Vector3.Angle(targetDir, transform.forward);
    print("角度(Vector)B:" + angle);
}

private void GetAngleC()
{
    Vector3 targetDir = target.position - transform.position;
    Vector3 playerForward = target.rotation * transform.forward;
    float angle = Mathf.Acos(Vector3.Dot(playerForward.normalized, targetDir.normalized)) * Mathf.Rad2Deg;
    print("角度(dot)C:" + angle);
}`

经我研究,觉得Cross也可以实现,下面是我的方法:
private void GetAngleD() { Vector3 targetDir = target.position - transform.position; Vector3 playerForward = transform.forward; float angle = Mathf.Asin(Vector3.Cross(playerForward.normalized, targetDir.normalized).y) * Mathf.Rad2Deg; print("角度(Cross)D:" + angle); }

如此四种方法,哪种效率最高,有待研究。
同样判断方向的也可以分别用Dot和Cross
方法一:Dot
//dot判断左右 private void GetDotdrection() { Vector3 targetDir = target.position - transform.position; float dir = Vector3.Dot(targetDir.normalized, transform.right); if (dir > 0) { print("dot右边"); } else { print("dot左边"); } }
方法二、使用Cross
` //使用Cross判断前后左右
private void GetCrossdrection()
{
Vector3 targetDir = target.position - transform.position;
Vector3 dirCross = Vector3.Cross(transform.forward, targetDir.normalized);
Vector3 dirCrossSide = Vector3.Cross(transform.right, targetDir.normalized);
Debug.Log(dirCross.y + ":" + dirCrossSide);
HideAllObjs();
//左前方向
if (dirCross.y > 0 & dirCrossSide.y > 0)
{
selfDirObj[3].gameObject.SetActive(true);
}
//右前方向
if (dirCross.y > 0 & dirCrossSide.y < 0)
{
selfDirObj[1].gameObject.SetActive(true);
}
//左后方向
if (dirCross.y < 0 & dirCrossSide.y > 0)
{
selfDirObj[2].gameObject.SetActive(true);
}
//右后方向
if (dirCross.y < 0 & dirCrossSide.y < 0)
{
selfDirObj[0].gameObject.SetActive(true);
}

    //float dir = dirCross.y;
    //if (dir > 0)
    //{
    //    selfDirObj[1].gameObject.SetActive(true);
    //    //print("cross右边");
    //}
    //else
    //{
    //    selfDirObj[0].gameObject.SetActive(true);
    //    //print("cross左边");
    //}
}
void HideAllObjs()
{
    foreach (var item in selfDirObj)
    {
        item.gameObject.SetActive(false);
    }
}

`
上面方法可以做P4项目的充气点位变化

posted @ 2022-11-20 20:01  cdjgame  阅读(22)  评论(0)    收藏  举报