如果尝试在互联网上搜索,但我找不到回复。
我试图计算从第一个向量看到的2个向量之间的角度。
因此,如果向量1为0,0且向量2为1,1,则标题为45。
在1,0那将是90。
在-1,0,它将是270。
是否有一个简单的解决方案来创建它?
答案 0 :(得分:1)
这不是Unity,这是一个数学问题。
您需要使用向量dot multiplication。它构造成统一的,等于矢量长度乘以它们之间角度的余弦的乘积,因此你很容易得到它之间的矢量之间的角度。当然,团结有built-in function for that。
由于每帧执行涉及向量的大量操作,因此有助于了解您正在运行的代码的性能影响。遗憾的是,这个问题的其他解决方案在计算上更复杂。另外,请记住,通常你不需要角度本身:角度的余弦实际上很容易使用。
当然,这个答案并不涵盖270度的情况。但是,对于这种应用程序,Quaternions更适合。基本上,270个案例要求你知道 up 向量来计算它,而向量本身(作为数学抽象)不包含那些信息 - 因此,在数学层面上,你不会&# 39; t有任何方法可以区分它们之间有270度和90度的向量。
所以,如果你真的需要270个案例,create quaternions from the vectors(顺便说一句,你可以看到 up 向量是一个独特的信息)然后{{3} }。与向量不同,Quaternions是为了处理旋转和方向而创建的,Unity具有为此实现的所有功能。
答案 1 :(得分:1)
给出偏移矢量(例如,相对于0,0,0)
.flex-container {
display: flex;
flex-wrap: wrap;
}
.flex-item {
width: 45%;
margin: 5px;
}
请注意,我们要添加360并取结果的模数,否则将得到0-180,然后是负角。按照原始海报的要求,这会将-1度转换为359度。 / p>
答案 2 :(得分:-1)
我无法测试它,但这应该有效:
double getHeading(Vector2 a, Vector2 b)
{
double x = b.x - a.x;
double y = b.y - a.y;
return Math.Atan2(y, x) * (180 / Math.PI);
}
答案 3 :(得分:-1)
非常感谢您的回复,我决定进行人工计算。 对于那些在我之后发现这个问题的人来说,我就是这样做的:
double calculateHeading(Transform target){
double newHeading = 0;
Vector3 vectorToTarget = target.position - transform.position;
double x = vectorToTarget.x;
double y = vectorToTarget.y;
if (x == 0 && y > 0) {
newHeading = 0;
} else if (x == 0 && y < 0) {
newHeading = 180;
} else if (x > 0 && y == 0) {
newHeading = 90;
} else if (x < 0 && y == 0) {
newHeading = 270;
} else if (y < 0) {
newHeading = 180 + (Mathf.Rad2Deg * Mathf.Atan (vectorToTarget.x / vectorToTarget.y));
} else if (y > 0) {
newHeading = 360 + (Mathf.Rad2Deg * Mathf.Atan (vectorToTarget.x / vectorToTarget.y));
}
if (newHeading > 360) {
newHeading -= 360;
} else if (newHeading < 0) {
newHeading += 360;
}
return newHeading;
}
答案 4 :(得分:-1)
老兄,你试过用谷歌吗?我只是用Google搜索&#34;两个向量之间的统一角度&#34;并找到官方文件。
https://docs.unity3d.com/ScriptReference/Vector3.Angle.html
var angle = Vector3.Angle(Vector3 from, Vector3 to);
或在你的情况下
var angle = Vector2.Angle(Vector2 from, Vector2 to);