如何计算旋转炮塔上枪管的子弹原点

时间:2016-02-21 10:58:54

标签: java algorithm math

问题

我想计算从炮塔中心出来的子弹的起源。

现状

我有一个带有中心枪管的炮塔,可以从中射出子弹。炮塔位于矢量location,而变化angle,i。即它一直在旋转。为了使中心炮塔从枪管末端射出子弹,我计算它的结束:

    double speed = 1;
    double angle = turret.angle;

    // start at the end of the barrel
    double x = turret.location.x + Math.cos( angle) * turret.centerCannonLength;
    double y = turret.location.y + Math.sin( angle) * turret.centerCannonLength;

    // calculate angle and velocity of bullets
    double dx = Math.cos(angle) * speed;
    double dy = Math.sin(angle) * speed;

我可以用这个来设置子弹的初始位置和速度:

    Bullet bullet = new Bullet();
    bullet.setLocation( x, y);
    bullet.setVelocity( dx, dy);
    bullet.setAngle( angle);

任务

现在我想再增加2个炮塔,炮塔就可以开火了。桶不在中心,它们左右偏移。

问题

如何从左右枪管中计算子弹的原点?

这是一个演示屏幕截图:

enter image description here

蓝色圆圈描述了炮塔的旋转。黄色部分是炮塔和中心枪管。红色部分是我想要计算子弹原点位置的额外左右桶。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

首先,在炮塔的局部坐标空间中定义原点的位置。中心桶将是:

localX = turret.centerCannonLength
localY = 0

然后,找到炮塔的当前旋转矩阵:

M = /  cos(angle)  -sin(angle)  \
    \  sin(angle)   cos(angle)  /

将此矩阵与本地位置相乘:

globalX = turret.location.x + cos(angle) * localX - sin(angle) * localY
globalY = turret.location.y + sin(angle) * localX + cos(angle) * localY