求两向量在0~360度之间的角度值及实际应用

实际应用

问题

先从实际问题出发,这样可以更好的理解问题.

项目需要控制角色在地图中随意移动,角色素材是8方向的. 那问题就是

如何根据点击的鼠标位置来决定使用哪个方向的图集?

分解问题

  • 首先8方向图集 360/8 = 45 也就是每45度一个图集. 然要注意起始角度并不是0度.

    不是0~45度 是图集A, 而应该是 -22.5~22.5 是图集A ,22.5 ~ 67.5(22.5+45) 是图集B 以此类推

  • 根据当前Touch(PosB),和上次Touch(PosA) 做一个向量AB , 只要求的该向量AB和Up向量(Vector2.up)之间的夹角即可

方法

方法一:

var angle = Vector2.Angle(toVector2,Vector2.up);
var cross = Vector3.Cross(toVector2,Vector2.up);

if (cross.z < 0)
{
   angle = 360 - angle;
}

方法二:

var angle = Vector2.SignedAngle(toVector2, Vector2.up);
if (angle < 0)
{
    angle = 360 + angle;
}

方法一

方法一是之前一直使用的,方法二是后来发现API中有的.也许是新加入的?(2017.1).

先从方法一说起.

首先是

var angle = Vector2.Angle(Vector2.up, toVector2);

取得角度这个方法,这个是无符号的.官网的API文档说的很清楚了

The angle returned is the unsigned acute angle between the two vectors. This means the smaller of the two possible angles between the two vectors is used. The result is never greater than 180 degrees.

也就是能取到的是最小夹角,比如返回一个30度. 你无法知道是30度还是330度(360-30).

这个就需要使用到 叉乘来判断了.

首先 叉乘 只能用于3D向量,但是确实又允许Vector3.Cross(Vector2.up, toVector2)这么写.

这个就可以把 Vector2.uptoVector2看成x-y平面的向量,其z=0.

那么他的叉积就是和z轴共线的向量

因为,Vector2.uptoVector2的z均为零,所以

两向量叉乘得到向量为(0,0,z)

同时又根据上面的公式 c的模=a的模 x b的模 x [email protected]

c的模 也就是 z

然后再根据正弦函数

可以知道. 当[email protected]<0 时候 也就是此时得到角度是大于180的.

比如上面angle给出来的是30度, 那么就需要用 360-30 得到 330度.

方法二

直接进到其API的实现就可以看到了

  • 红框部分就是 var angle = Vector2.Angle(Vector2.up, toVector2);
  • 篮框部分就是 z

叉积向量

x = y1z2 - z1y2

y = z1x2 - x1z2

z = x1y2 - y1x2

因为z1和z2都是0,所以叉积就是向量(0,0,x1y2 - y1x2)

换句话说就是 方法二 其实就是封装后的 方法一

原文地址:https://www.cnblogs.com/eran/p/9245926.html

时间: 2024-08-30 02:35:29

求两向量在0~360度之间的角度值及实际应用的相关文章

编写函数求两个整数 a 和 b 之间的较大值。要求不能使用if, while, switch, for, ?: 以 及任何的比较语句。

本题要求不能使用if, while, switch, for, ?: 以 及任何的比较语句,也就是要求我们不能用常规的方法来判断两个数的大小. 那么按照以往的方法,要判断两个数的大小,应该要将两个数进行减法运算,将结果与0进行比较.那现在不行进行比较,我们应该怎么办? 我们知道变量分为signed 和 unsigned 两种,有符号变量用最高位代表符号位. 当变量值为负数时,变量值的最高位为1, 当变量值为正数时,最高位为0 基于这种特性,我们可以用一个数组保存用于比较的两个数的值.如array

poj 3129 How I Wonder What You Are! 点积求两向量夹角

水题,直接贴代码. //poj 3129 //sep9 #include <iostream> #include <cmath> using namespace std; const double eps=0.00000001; struct P{ double x,y,z; }p[512],tel[64]; double a[64]; int main() { int i,j,cnt,n,m; while(scanf("%d",&n)==1&&

c++谭浩强教材教学练习例题1.2 求两数之和 为什么sum=a+b;sum的值为65538

第一章 #include <iostream>using namespace std; int main(){ int a,b,sum; sum=a+b; cin>>a>>b; cout<<"a+b="<<sum<<endl; return 0;} //原因sum=a+b;此语句位置不对,变量a,b在没有赋值时就被相加,超出int最大值范围.只能得到最大值65538 #include <iostream>

关于Unity视频播放器插件 AVPro Video(三)360度全景视频播放

1.官网下载该插件或者我分享的链接: 链接:https://pan.baidu.com/s/1boGeJ8r 密码:mvbf 2.拖入官方做好的预制体"360SphereVideo"或者"360CubeVideo"(两种不同的360度全景)到场景中,并将场景中的摄像机拖动到"Sphere"下方并Resert 3.设置"AVPro Video Media Player"上的Media Player 控制组件即可(具体操作参考&q

求两个日期之间间隔的天数,Python实现

代码如下 1 def leap_year(y): #判断是否是闰年 2 if (y % 4 == 0 and y % 100 != 0) or y % 400 == 0: 3 return True 4 else: 5 return False 6 7 def days_in_month(y, m): #判断每个月都有几天 8 if m in [1, 3, 5, 7, 8, 10, 12]: 9 return 31 10 elif m in [4, 6, 9, 11]: 11 return 30

js 求两个日期之间相差天数

//求两个日期之间的相差天数 function daysBetween(DateOne, DateTwo) { var OneMonth = DateOne.substring(5, DateOne.lastIndexOf('/')); var OneDay = DateOne.substring(DateOne.length, DateOne.lastIndexOf('/') + 1); var OneYear = DateOne.substring(0, DateOne.indexOf('/

POJ 1080 Human Gene Functions(求两字符串相似度:LCS变形)

POJ 1080 Human Gene Functions(求两字符串相似度:LCS变形) http://poj.org/problem?id=1080 题意: HDU1080 给你两个由字符A,C,G,T构造的字符串s1和s2, 现在你可以在这两个字符串中插入空格, 使得两串长相等(但是不能使得s1的空格对应s2的空格位置). 然后给你s1的特定字符对应s2中特定字符所能获得的分数矩阵: 问你最后两个字符串所能获得的最大分数是多少? 分析: 本题很类似于求字符串最短编辑距离或者求字符串LCS的

Frogger POJ - 2253(求两个石头之间”所有通路中最长边中“的最小边)

题意 ? 题目主要说的是,有两只青蛙,在两个石头上,他们之间也有一些石头,一只青蛙要想到达另一只青蛙所在地方,必须跳在石头上.题目中给出了两只青蛙的初始位置,以及剩余石头的位置,问一只青蛙到达另一只青蛙所在地的所有路径中的"the frog distance"中的最小值. ? 解释一下"the frog distance": 题目中给出了一段解释"The frog distance (humans also call it minimax distance

求两个数之间的随机正整数

求两个数之间的随机正整 数.并添到新数组,数组长度由自己指定.并且数组中不能有重复的值 function getRandomInt (min, max) { return Math.floor(Math.random() * (max - min + 1) + min) } function numInt(n, min, max) { const arr = [] while(arr.length < n) { let num = getRandomInt(min, max) if (arr.i