问题
我想计算从炮塔中心出来的子弹的起源。
现状
我有一个带有中心枪管的炮塔,可以从中射出子弹。炮塔位于矢量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个炮塔,炮塔就可以开火了。桶不在中心,它们左右偏移。
问题
如何从左右枪管中计算子弹的原点?
这是一个演示屏幕截图:
蓝色圆圈描述了炮塔的旋转。黄色部分是炮塔和中心枪管。红色部分是我想要计算子弹原点位置的额外左右桶。
非常感谢您的帮助!
答案 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