0

だから私は自分の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枚目は少し高め、最後は縦に見たところです。

ここで何が間違っていますか?私はこのソリューションを自分で設計しましたが、どこかを台無しにしていると確信できますが、それを理解することはできません:/

4

2 に答える 2

0

基本的に、垂直方向のオフセット計算 (float)Math.cos(direction[0]*piover180) は、X と Z の動きを台無しにしていました。これは、両方とも 0 になるためです。弾丸は回転するため、垂直線を作成します。ランダム性を持つ X 軸。私の解決策は、垂直方向のオフセット計算の後にランダム性を追加することでした。これにより、発射後も左右上下に移動します。

また、追加のランダム値を追加する必要がありました。そうしないと、対角線または十字を描くだけです。

    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);
    float randomZ=(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, playerYrot}, new float[]{randomX,randomY, randomZ},(float) 0.5));

そして動くコードは…

    vector[0]= -((float)Math.sin(dir[1]*piover180) * (float)Math.cos(dir[0]*piover180)+(float)Math.sin(random[1]*piover180)) * speed;
    vector[1]= ((float)Math.sin(dir[0]*piover180)+(float)Math.sin(random[0]*piover180)) * speed;
    vector[2]= -((float)Math.cos(dir[1]*piover180) * (float)Math.cos(dir[0]*piover180)+(float)Math.sin(random[2]*piover180)) * speed;
于 2013-02-18T20:14:15.283 に答える