c# - 如何从相对方向确定 360° 角?

标签 c# math angle direction

我在屏幕上有一个小 map ,并且无法确定目标相对于相机的角度。

下面是一些关于我的意思的图,以及一些相机位置和方向的例子:

I describe the problem (hopefully)

  • 黑色三角形代表相机。
  • 黑色箭头定义了它们的前进方向。
  • 蓝色箭头是从相机到目标(= 中间的红点)的方向。
  • 特定相机中的圆圈定义了其红点的所需方向。

到目前为止,这是我的代码:

//Anchored position around minimap circle
void CalculateScreenPos(){
    Vector3 dir = transform.position - cam.position; //xz distance 
    dir.y = 0;
    angle = Angle360(cam.forward.normalized, dir.normalized, cam.right);

    Vector2 desiredPosition = new Vector2(
        eX * -Mathf.Cos(angle * Mathf.PI/180f) * dir.z, 
        eY * Mathf.Sin(angle * Mathf.PI/180f) * dir.x
    );

    minimapBlip.anchoredPosition = desiredPosition;
}

public static float Angle360(Vector3 from, Vector3 to, Vector3 right)
{
    float angle = Vector3.Angle(from, to);
    return (Vector3.Angle(right, to) > 90f) ? 360f - angle : angle;
}

但是角度好像不太对,发现范围从

0° + cam.eulerXAngles.x to 360° - cam.eulerAngles.x

所以当摄像头从不看向地面或天空时它会起作用。

如何通过不再次将其减去/添加到角度来摆脱不需要的添加 x-eulerAngles ?

angle -= cam.transform.eulerAngles.x

是一个糟糕的选择,因为当 Angle360 的结果为 360 时,它会再次被减去,立即导致错误的角度。

圆也可以是椭圆,这就是为什么我将 eXeY 放在确定椭圆延伸的所需位置。

最佳答案

我不知道您使用的是什么数据类型,例如cam.positioncam.heading 等,但一些一般指导可帮助您调试此问题。

  1. 编写单元测试。准备一些固定数据,用于输入(例如设置 cam.position/cam.headingtransform 等)和输出(预期角度)。在某些情况下执行此操作,例如您展示的所有六个示例。这样可以更轻松地重复您的测试,并了解哪种情况不起作用 - 您可能会看到一个模式。它还使您可以轻松地通过调试器运行代码。

  2. 将您的职能分解为逻辑工作单元。 Angle360 有什么作用?我猜你明白它应该做什么,但我认为它实际上是两个功能

    1. 获取两个向量(当前方向和目标方向)的夹角
    2. 旋转 map (或类似的东西)
  3. 为那些被分解的函数编写测试。您只是在使用一些库角度差函数 - 它的行为是否符合您的预期?

  4. 为您的变量命名。您有一个名为 right 的向量 - 那是什么?没有评论。 right 是在“正确”中,还是在“左对面”中?为什么是Vector3.Angle(right, to),为什么不是Vector3.Angle(to, right)

通常,您在执行一些数学运算时会被绊倒,因为您的代码不清晰、事物命名不正确以及方法不清晰。将问题分解成更小的部分,问题就会变得很明显。

关于c# - 如何从相对方向确定 360° 角?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48832705/

相关文章:

r - 如何根据R中的U和V风分量计算风向

math - 是否有一个不环绕的字节/字的名称?

java - 绕轴旋转椭圆

android - 旋转图像,并显示旋转角度

c# - 编码 CDATA 元素的有效方法

c++ - 出现数学错误试图计算天然气的基本价格

javascript - 在 D3 中将地理形状缩放至相似大小

c# - 查找带和不带连字符的单词的所有可能组合

c# - 无法在 Visual Studio 2012 中调试 Windows 服务

c# - HttpClient-向Get请求添加参数