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

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

[原创] 【原创】三维数学综合练习-计算爆炸点与玩家的切点坐标--重点案例

[复制链接]
发表于 2021-8-4 11:09:09 | 显示全部楼层 |阅读模式
本帖最后由 da11 于 2021-8-4 16:34 编辑

题目:


     

本帖子中包含更多资源

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

x
 楼主| 发表于 2021-8-4 11:14:28 | 显示全部楼层
//脚本挂在炸弹上,案例演示圆球为炸弹,黄色圆柱体为玩家!
//有缺陷版本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MathWork : MonoBehaviour
{
    //小练习:炸弹攻击范围的判定;如图:
    //攻击范围,炸弹范围的50m

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

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

    private Vector3 BoomVector3;

    public GameObject TestGameObj;

    private Vector3 TestGameObjVector3;

    private float TestGameObjRadius;

    private Vector3 TwoPointMinus;

    private Vector3 TwoPointMinus1;

    private float TwoPoint;

    private float TwoPointAngle;


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

    private void Update()
    {
        JXQD();

    }

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

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

        //测量两点间距
        TwoPoint = Vector3.Distance(BoomVector3, TestGameObjVector3);

        TwoPointMinus = BoomVector3.normalized - TestGameObjVector3.normalized;

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

        //模长归一化
        TwoPointMinus = TwoPointMinus.normalized;

        Debug.Log(TwoPointMinus.magnitude);

        //Debug.DrawLine(TestGameObjVector3, BoomVector3);

        //Debug.DrawLine(Vector3.zero, TwoPointMinus);

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

        //获得左切点坐标
        TwoPointMinus = (TestGameObj.transform.rotation * Quaternion.Euler(0, TwoPointAngle, 0)) * (TestGameObj.transform.position + TwoPointMinus);

        //获得右切点坐标
        TwoPointMinus1 = (TestGameObj.transform.rotation * Quaternion.Euler(0, -TwoPointAngle, 0)) * (TestGameObj.transform.position + TwoPointMinus);

        Debug.DrawLine(BoomVector3, TwoPointMinus);

        Debug.DrawLine(BoomVector3, TwoPointMinus1);
    }
}



脚本动图:



本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-4 12:10:02 | 显示全部楼层
本帖最后由 da11 于 2021-8-4 12:11 编辑

//已修正版
//脚本挂在炸弹游戏物体上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MathWork : MonoBehaviour
{
    //小练习:炸弹攻击范围的判定;如图:
    //攻击范围,炸弹范围的50m

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

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

    private Vector3 BoomVector3;

    public GameObject TestGameObj;

    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()
    {
        JXQD();

    }

    //计算切点方法
    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;

        Debug.DrawLine(BoomVector3, LeftPoint);

        Debug.DrawLine(BoomVector3, RightPoint);
    }
}



动图演示:


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-4 16:30:17 | 显示全部楼层
本帖最后由 da11 于 2021-8-4 16:34 编辑

代码在unity坐标系的图:


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

游客
回复
*滑块验证:

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