返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 2275|回复: 0

[原创] 【原创】三维数学练习-计算炸弹到玩家切点坐标

[复制链接]
发表于 2021-9-7 13:43:29 | 显示全部楼层 |阅读模式
    //小练习:炸弹攻击范围的判定;如图:
    //攻击范围,炸弹范围的50m

    //练习题目:计算炸弹到玩家切点坐标,要求随玩家改变位置,切点位置也要跟着改变
    //已知条件:玩家的半径(一般实际项目,人物都会使用胶囊(Capsule)作为人物的边界,使用胶囊(Capsule)的Radius作为人物的半径坐标)
    //炸弹位置

    //思路:
    //1.计算玩家到爆炸点方向,只截取玩家边界的半径长向量
    //2.计算玩家中心点至切点-爆炸点方向位置的夹角角度,然后根据这个角度旋转。

    private Vector3 BoomVector3;

    public GameObject TestGameObj;  //使用胶囊(Capsule)物体

    private Vector3 TestGameObjVector3;

    private float TestGameObjRadius;

    private Vector3 TwoPointMinus;

    private Vector3 TwoPoint;

    private float TwoPointAngle;

    private Vector3 LeftPoint;

    private Vector3 RightPoint;


    //有缺陷,切点移动的时候不一致
    private void Start()
    {
        //获取玩家边界半径
        TestGameObjRadius = (TestGameObj.GetComponent<CapsuleCollider>().radius);
        Debug.Log(TestGameObjRadius);
    }

    private void Update()
    {
        CheckQD();
    }

    //计算切点方法
    private void JXQD()
    {
        //获取炸弹位置
        BoomVector3 = this.transform.position;

        //获取玩家位置,因为需要实时判断,所以需要放到update上获取。
        TestGameObjVector3 = TestGameObj.transform.position;

        //两个位置相减得到两个位置的向量
        TwoPoint = BoomVector3 - TestGameObjVector3;

        //TwoPointMinus = TestGameObjVector3.normalized - BoomVector3.normalized;

        //短距离向量的长度获取逻辑:模长归一化,并乘上半径。
        TwoPointMinus = TwoPoint.normalized * TestGameObjRadius;

        //Debug.Log(TwoPointMinus.magnitude);

        //反余弦: arccos b(临边) / c(斜边) = x;
        //利用反余弦,计算夹角的角度
        TwoPointAngle = Mathf.Acos(TestGameObjRadius / TwoPoint.magnitude) * Mathf.Rad2Deg;

        //获得左切点坐标,注意,此处要加上玩家的位置,而且注意是加在旋转角度前的位置!!
        LeftPoint = TestGameObj.transform.position + Quaternion.Euler(0, TwoPointAngle, 0) *  TwoPointMinus;

        //获得右切点坐标,注意,此处要加上玩家的位置,而且注意是加在旋转角度前的位置!!
        RightPoint = TestGameObj.transform.position + Quaternion.Euler(0, -TwoPointAngle, 0) * TwoPointMinus;


    }

    //检测切点方法
    public void CheckQD()
    {
        JXQD();

        Debug.DrawLine(BoomVector3, LeftPoint);

        Debug.DrawLine(BoomVector3, RightPoint);

    }

//案例动图,图片较大,请耐心等候:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表