对不起,这个头衔不好,但是我什么也没想到。
让我解释一下:我有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相对于飞船的真实旋转。
最佳答案
如果我说对了,则说明您有一艘船(例如,在屏幕中间)围绕着佳能球旋转,以瞄准另一艘可移动的船。所有这些都是3D(?)。假设这就是您的意思,这是一个答案;):
首先在二维空间中进行操作。首先需要一个公式来计算圆。一个函数对于每个x值只能有一个y值,因此实际上需要两个。最明智的做法可能是将法线从静态飞船面向的方向划分为共同的360°,然后使公式计算x和y坐标。一种方法可以使用圆的公式(+/-r²=x²+y²,r为半径),但是我认为使用cos和sin的方法会更容易。因此:
您可能希望输入一个角度。如果该角度为90°,则您的炮弹在船的右侧。您的船下方为180°,左侧为270°,上方为0°/ 360°。然后,我将输入该角度并添加90°,以便您可以从船的左侧开始(对于cos和sin的工作很重要!)。现在我们知道的是炮弹的角度和圆的半径。假设您知道船中央的坐标,则可以在坐标系中想象自己,而船就是原点。现在您需要计算x。这可以通过以下方式完成:
x = -cos ^ -1(ANGLE)*半径结果将是您的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));
}
我希望这是您的要求,希望对您有所帮助!