【问题标题】:Building a radar建造雷达
【发布时间】:2012-12-09 04:05:40
【问题描述】:

我想尝试在 Java OpenGL 中构建一个雷达。基本上在该方法中,您传入玩家的当前位置、玩家面向的角度和敌人的位置。如果敌人在正前方,红点(象征敌人)应该在圆圈(雷达)的顶部,可以说是 0 度。如果直接向右,则红点将是 90 度,等等。基本上,我试图找到直接在玩家面前射出的矢量与从玩家到敌人的矢量之间的角度。我该怎么做呢?我环顾四周,发现了 atan2() 的建议,但还不确定如何使用它。如果有更快、更有效的处理方式,也请告诉我。

编辑:我使用了绘制点的方法而不是点积和cos等,并且我使用玩家的位置作为原点。但是,如果距离大于使用距离公式选择的数字 70,我将如何让敌方点出现在雷达边缘?小于 70 的任何东西都会在雷达内,但任何超过 70 的敌人,我希望敌人只是在雷达边缘盘旋,而不是让敌人的点消失。

【问题讨论】:

  • OP 仅在一处(并作为标签)提及Java。答案是普遍而广泛的,因此也可以使非 Java 开发人员受益。由于上述原因,不应该将其迁移到Programmers(甚至是Mathematica)吗?

标签: java math vector angle


【解决方案1】:

假设你的玩家和敌人在某个 2D 空间(甚至是 3D 空间,但他们在 2D 平面上移动,例如平地)中具有坐标,我认为更简单的方法是直接在玩家/敌人实体的位置到雷达上,然后根据玩家当前相对于真北的角度,以玩家为原点在雷达上应用旋转变换。

【讨论】:

  • 我用了这个方法。但是,如果距离大于使用距离公式选择的数字 70,我将如何让敌方点出现在雷达边缘?小于 70 的任何东西都会在雷达内,但任何超过 70 的敌人,我希望敌人只是在雷达边缘盘旋,而不是让敌人的点消失。
  • @Ali 给定玩家位置和敌人位置,可以计算距离。如果距离大于雷达的半径,则求解以下交点:a)玩家+敌人之间的直线,b)代表雷达轮廓的圆。
  • 如果我用方形雷达来代替呢?
  • @Ali 同样的想法,但不是用你的线与圆相交,而是用正方形进行相交测试(你可以将正方形定义为 4 条不同的线)
【解决方案2】:

如果你使用向量,你可以使用两个向量的点积等于它们的大小和它们之间夹角的余弦的乘积的性质:

你。 v = |u| |v| cos(θ)

u 是玩家的方向,v 是玩家到敌人的矢量。

你正在寻找theta,所以你只需要使用:

theta = acos((v . u) / (|v| |u|))

请注意,这只会给您角度,而不是向左还是向右。要找到它,我们可以取叉积,看看它是正还是负:

is_left = |u X v| 
    

【讨论】:

    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2011-02-18
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多