所以我制作了自己的 FPS、图形和枪支以及所有这些很酷的东西;当我们开火时,子弹应该在十字准线内随机移动,定义如下:
float randomX=(float)Math.random()*(0.08f*guns[currentWeapon].currAcc)-(0.04f*guns[currentWeapon].currAcc);
float randomY=(float)Math.random()*(0.08f*guns[currentWeapon].currAcc)-(0.04f*guns[currentWeapon].currAcc);
bulletList.add(new Bullet(new float[]{playerXpos, playerYpos, playerZpos}, new float[]{playerXrot+randomX, playerYrot+randomY}, (float) 0.5));
我们计算 X 和 Y 的随机性(假设你的十字准线大小 (guns[currentWeapon].currAcc) 为 10,那么子弹可以向任何一侧移动 0.4 并且它会保留在十字准线内。计算完之后,我们发送玩家位置作为子弹的起始位置,以及它打算采取的方向(具有额外随机性的玩家方向),最后是速度(不是重要的 atm,tho)。
现在,每一帧,子弹都必须移动,所以对于每个子弹,我们调用:
position[0] -= (float)Math.sin(direction[1]*piover180) * (float)Math.cos(direction[0]*piover180) * speed;
position[2] -= (float)Math.cos(direction[1]*piover180) * (float)Math.cos(direction[0]*piover180) * speed;
position[1] += (float)Math.sin(direction[0]*piover180) * speed;
因此,对于 X 和 Z 位置,子弹根据玩家在 Y 和 X 轴上的旋转移动(假设您水平观察 Z,X 为 0 度,Y 为 0;X 将移动 0*1*speed 和 Z将移动 1*1* 速度)。
对于 Y 位置,子弹根据 X 轴上的旋转移动(在 -90 和 90 之间变化),这意味着如果玩家水平看,它会保持在相同的高度,如果玩家垂直看,它会完全向上移动。
现在,问题如下:如果我水平拍摄,一切都很好。子弹散布在十字准线周围,如https://dl.dropbox.com/u/16387578/horiz.jpg所示
问题是,如果我开始向上看,子弹开始集中在中心周围,并使这条垂直线越靠近我看的天空。 https://dl.dropbox.com/u/16387578/verti.jpg 第一张图片在 X 轴上大约 40º,第二张稍微高一点,最后一张是我垂直看的时候。
我在这里做错了什么?我自己设计了这个解决方案,我很确定我在某个地方搞砸了,但我想不通:/