求两个向量之间的夹角

2024-02-28 18:04
文章标签 两个 之间 向量 夹角

本文主要是介绍求两个向量之间的夹角,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

求两个向量之间的夹角

  • 介绍
  • Unity的API求向量夹角
    • Vector3.Angle
    • Vector3.SignedAngle
  • 自定义获取方法
    • 0-360度的夹角
  • 总结

介绍

求两个向量之间的夹角方法有很多,比如说Unity中的Vector3.Angle,Vector3.SignedAngle等方法,具体在什么情况下使用这个还是得看这几个函数的结果是什么。

Unity的API求向量夹角

通过蓝线和红线来做对比有如下的例子,以及打印如下
在这里插入图片描述

Vector3.Angle

这个API
这个API会计算出来这两个向量的夹角,不带正负号且通过测试发现这个角度只是小于180度的夹角,也就是说只是计算正向最小夹角使用

Vector3.SignedAngle

在这里插入图片描述
这个API计算的是从from向量到to向量的夹角,并且需要一个轴向(比如我需要计算的是XZ轴的夹角,则我axis轴向我写Vector3.Up即可)。
通过检测发现这个方法是有正负号的,区间为[-180,180]之间。
也就是说想要计算有符号的夹角则可以使用这个方法。

自定义获取方法

    /// <summary>/// 计算夹角带有正负号/// </summary>/// <param name="from"></param>/// <param name="to"></param>/// <param name="n"></param>/// <returns></returns>public float AngleSigned(Vector3 from, Vector3 to, Vector3 n){return Mathf.Atan2(Vector3.Dot(n, Vector3.Cross(from, to)),Vector3.Dot(from, to)) * Mathf.Rad2Deg;}
    /// <summary>/// 计算夹角带有正负号/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <param name="dir"></param>/// <returns></returns>private float GetAngle(Vector3 a, Vector3 b, Vector3 dir){float angle1 = Vector3.Angle(a, b); //求出两向量之间的夹角  Vector3 normal = Vector3.Cross(a, b);//叉乘求出法线向量  angle1 *= Mathf.Sign(Vector3.Dot(normal, dir));  //求法线向量与物体上方向向量点乘,结果为1或-1,修正旋转方向return angle1;}

上述我提供得这两个方法经过测试也是可行的。
第一种AngleSigned方法类似于Unity的原生API Vector3.SignedAngle
第二种GetAngle方法其实就是先计算出来正常的不带符号的角度,在去用叉乘计算一下是左侧还是右侧最终给计算出的角度加上了正负号。

0-360度的夹角

如果要计算0-360度的夹角,则完全可以将上面得到的[-180,180]的夹角判定为附属时+360,判定为正时则不处理,这样就得到了区间[0,360]的夹角

总结

以上是对计算角度的一些相关计算,如果有写的不对或者有更好的想法可以评论说下,感谢大家的支持和关注!

这篇关于求两个向量之间的夹角的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/756213

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介