だから私は自分の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ではありません)。
ここで、各フレームで弾丸を移動する必要があるため、各弾丸に対して次のように呼び出します。
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*速度、Z は移動します)。 1*1*速度で移動します)。
Y 位置の場合、弾丸は X 軸の回転に従って移動します (-90 から 90 の間で変化します)。つまり、プレーヤーが水平方向を見ている場合は同じ高さに留まり、プレーヤーが垂直方向を見ている場合は完全に上に移動します。
さて、問題は次のようになります。水平に撮影すると、すべてが美しく機能します。https://dl.dropbox.com/u/16387578/horiz.jpgに見られるように、十字線の周りに弾丸が広がる
問題は、私が見上げ始めると、弾丸が中心に集中し始め、この垂直線が空に向かってさらに深くなるということです. https://dl.dropbox.com/u/16387578/verti.jpg 1枚目はX軸で40度前後、2枚目は少し高め、最後は縦に見たところです。
ここで何が間違っていますか?私はこのソリューションを自分で設計しましたが、どこかを台無しにしていると確信できますが、それを理解することはできません:/