Unity中计算两个三维坐标点的各种方法

本文介绍了如何使用C#进行几何空间计算,包括根据勾股定理计算两点距离,向量在平面上的投影角度,以及目标物体相对于自身或其他参照物的方位判断。
摘要由CSDN通过智能技术生成

1、 根据勾股定理计算两点的距离

  /// <summary>
  /// 根据勾股定理计算两点的距离
  /// </summary>
  /// <param name="point1"></param>
  /// <param name="point2"></param>
  /// <returns></returns>
  private float CalculateTwoPointDistance(Vector3 point1, Vector3 point2)
  {
      //根据勾股定理(a²+b²=c²)求出支撑杆长度,开c的平方根得到弦的长度
      float c = Vector3.Distance(point2, point1);
      float a = Mathf.Abs(point2.y - point1.y);
      return Mathf.Sqrt(Mathf.Pow(c, 2) - Mathf.Pow(a, 2));
  }

2、计算两条向量在某平面上的投影之间的角度。有正负值的角度。根据左手定律确定顺、逆时针旋转方向

    /// <summary>
    /// 计算两条向量在某平面上的投影之间的角度。有正负值的角度。根据左手定律确定顺、逆时针旋转方向
    /// </summary>
    /// <param name="from"> 当前向量 </param>
    /// <param name="to"> 比较向量 </param>
    /// <returns></returns>
    private float SignedAngleProject(Vector3 from, Vector3 to, Vector3 plane)
    {
        /* 计算投影向量 */
        Vector3 projectLast = Vector3.ProjectOnPlane(from, plane);
        Vector3 projectCur = Vector3.ProjectOnPlane(to, plane);
        float signed_angle = Vector3.SignedAngle(projectLast.normalized, projectCur.normalized, plane);
        return signed_angle;
    }

3、获取两点之间距离一定百分比的一个点


        /// <summary>
        /// 获取两点之间距离一定百分比的一个点
        /// </summary>
        /// <param name="start">起始点</param>
        /// <param name="end">结束点</param>
        /// <param name="percent">起始点到目标点距离百分比</param>
        /// <returns></returns>
        public static Vector3 CalcBetweenPoint(Vector3 start, Vector3 end, float percent = 0.5f)
        {
            Vector3 normal = (end - start).normalized;
            float distance = Vector3.Distance(start, end);
            return normal * (distance * percent) + start;
        }

4、计算目标物体相对于自身方位(前后左右上下)


        /// <summary>
        /// 计算目标物体相对于自身方位
        /// </summary>
        /// <param name="target"></param>
        public float CalcTargetDirForMe(Transform target, DirectionType directionType, Transform oneself)
        {
            Vector3 dir = (target.position - oneself.position).normalized; //位置差,方向
            float dot;
            if (directionType.Equals(DirectionType.Forward))
                dot = Vector3.Dot(target.forward, dir);//点乘判断前后   //dot >0在前  <0在后
            else if (directionType.Equals(DirectionType.Right))
                dot = Vector3.Dot(target.right, dir);//点乘判断左右
            else if (directionType.Equals(DirectionType.Up))
                dot = Vector3.Dot(target.up, dir);//点乘判断上下
            else
                dot = 0;//中心
            return dot;
        }

        public enum DirectionType
        {
            Forward,
            Right,
            Up,
        }

5、计算目标物体相对于自身方位(前后)


        /// <summary>
        /// 计算目标物体相对于自身方位
        /// </summary>
        /// <param name="target"></param>
        public float CalcTargetDirForMe(Transform target)
        {
            Vector3 dir = target.position - cameraRig.position; //位置差,方向
            float dot = Vector3.Dot(target.forward, dir);//点乘判断前后   //dot >0在前  <0在后 
            return dot;
        }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值