如何在船周围旋转CannonBall?

时间:2014-05-20 18:01:40

标签: java math

对不好的标题感到抱歉,但我想不出别的什么。

让我解释一下:我有2艘船。碰撞世界中的船,以及现实世界中的船。

现在现实世界中的船正在旋转,但是我无法在碰撞世界中旋转船(或移动它),这意味着碰撞对象必须在碰撞世界中围绕船旋转。

当CannonBall靠近船时,我得到CannonBall到船的距离(对于x,y和z),然后将其与作为碰撞点的三个坐标数组(约2000+)进行比较 - 如果三重数组的结果是" 1",那么它们就会发生冲突。换句话说,碰撞船不会移动,但在碰撞代码中,CannonBall的位置与现实世界船和现实世界CannonBall的距离相同。

现在问题是:如果船是旋转的,我需要在船周围旋转CannonBall,因为船不能旋转。 我该怎么做?什么样的数学公式? 注意:我有 - 船的旋转,x,y和z坐标,以及CannonBall的x,y和z坐标。

谢谢,如果有人能给我一个答案!

编辑:让我们更清楚。 在现实世界中,ship1可以在ship2上发射CannonBall。如果我参考"船",我的意思是ship2。 当CannonBall靠近船时,我希望它检查碰撞。要做到这一点,(物理世界)我检查array[CannonBall.distance(ship).x][CannonBall.distance(ship).y][CannonBall.distance(ship).z]是否返回" 1"如果是,它会发生冲突。 但是,由于我无法在没有大量处理的情况下更改阵列,因此无法更改船舶的旋转。因此,我必须围绕它旋转CannonBall,使其相对于与船舶相比的CannonBall的真实旋转。

1 个答案:

答案 0 :(得分:2)

如果我找到了你,那么你正在拥有一艘船(例如在屏幕中间),它有一个围绕它旋转的教规球,以便瞄准另一艘可移动的船。所有这些都是3D(?)。假设这就是你的意思,这是一个答案;):

让我们先在二维空间中做到这一点。您首先需要的是计算圆的公式。由于函数每个x值只能有一个y值,因此实际需要两个。最聪明的做法可能是将你的佳能球面向静态船的方向划分为普通的360°,然后让公式计算x和y坐标。一种方法可以使用圆的公式(+/-r²=x²+y²,其中r是半径),但我认为使用cos和sin的方法会更容易。因此: 您可能希望输入角度。如果这个角度是90°,那么你的炮弹就在船的右边。 180°将位于您的船下方,270°位于左侧,0°/ 360°位于您的上方。然后我会接受该输入并向其添加90°,这样您就可以从船的左侧开始(重要的是cos和罪恶工作!)。我们现在知道的是炮弹的角度和圆的半径。假设您知道船中间的坐标,那么您可以将自己想象成一个坐标系,您的船就是原点。现在你需要计算x。这可以通过以下方式完成: x = -cos ^ -1(ANGLE)* radius。结果将是您的x坐标,您必须从船舶坐标的中间减去。然后,在x和角度已知的情况下,您可以计算y = x / tan-1(ANGLE)。如果原始角度大于90°,​​则必须将y坐标乘以-1。 对此的方法是:

public void calculateCordinates(int degrees, int r){
    degrees = degrees+90;
    while(degrees>=360){degrees=degrees-360;}//ensures that degree < 360°
    double x;
    double y;
    x = Math.acos(Math.toRadians((double)degrees))*r;
    y = x/Math.atan(Math.toRadians((double)degrees));
}

坐标现在是双倍的,因为结果大部分时间都不是整数。在从原点坐标中减去它们之前将它们舍入为整数。

如果要在3D中执行此操作,可以使用相同的方法计算y坐标。这次,你输入的角度是你的第三维角度,所以“你在屏幕上看到的角度,在屏幕外面,你的右耳在屏幕上等等”(抱歉,不知道)如何描述更好)。当然,您也可以将方法合并为一个,看起来像这样:

 public void calculateCordinates(int degrees, int degrees3D, int r){
    degrees = degrees+90;
    while(degrees>=360){degrees=degrees-360;}
    double x;
    double y;
    double z;
    x = Math.acos(Math.toRadians((double)degrees))*r;
    y = x/Math.atan(Math.toRadians((double)degrees));
    z = x/Math.atan(Math.toRadians((double)degrees3D));
}

我希望这就是你所要求的,我希望它有所帮助!