求两个向量之间的夹角

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

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点