1

ここに画像の説明を入力

オブジェクト (BLACK) の進行方向 (GREEN) の有効範囲 (RED) を計算するにはどうすればよいですか。緑は Vector2 で、x と y の範囲は -1 から 1 です。

ここでやろうとしているのは、ロケット燃料の燃焼効果を作成することです。だから私が得たのは

  • ロケット速度(浮き)
  • ロケットの方向 (Vector2 x = [-1, 1], y = [-1, 1])

燃料の燃焼効果(パーティクル)は、その位置で独自の速度で作成されるため、ロケットの速度は問題ではないと思うかもしれません。

4

2 に答える 2

4

2D ベクトルを使った安くて楽しいトリックは、x と y を転置し、そのうちの 1 つの符号を反転して垂直ベクトルを取得することです (疑似コード)。

Vector2 perpendicular ( -original.y, original.x ) // Or original.y, -original.x

次に、次のようなことができます。

direction + perpendicular * rand(-0.3 , 0.3)

更新:質問が反対のベクトルを求めていることに気付いたので(写真を見るのに忙しすぎます!)、私もそれに答えたほうがよいと思います。「方向」に -1 を掛けて、反対のベクトルを取得します。したがって、この:

perpendicular * rand(-0.3 , 0.3) - direction

範囲内のどこかにランダムな方向ベクトルを与える必要があります(正規化されていませんが、これらの目的には十分に近いです)。次に、テールの長さに応じて、その結果に乱数を掛けることができます。

于 2012-11-13T09:31:21.090 に答える
0

OlduwanSteve の回答に費やされる場合は、ある程度物理的に正確になるようにすることができます。

追放を表すベクトルをいくつか作成します (赤い線)。
最初に、追放を表すベクトルの数を定義します - n とマークします。

合計が Vx になる n 個の数値のセットを取得します。これらの数値は、追放ベクトルの x コンポーネントになります。これは次のように行うことができます (半疑似コード):

SumX = Vx;
for (i = 0; i < n; i++)
{
    Ax[i] = -rand(0..SumX); // Ax is the array of all expulsion vectors x components 
    SumX -= Ax[i]; 
}

次に、Ay (追放ベクトルの y コンポーネント) を計算します。これは、SumY = 0 であることを除いて、 の計算と非常によく似ています。

ここでは、SumY を n 個の要素に分割する代わりに、最大の y コンポーネントを決定する必要があります。これを選択する最善の方法は、追放ベクトルの最大許容角度を定義し、maxVy = minVx*tan(maxAlpha) を使用して最大 Vy を定義することです。

これで、これを使用して Ay を取得できます (半疑似コード):

SumY = maxVy*2; // The actual range is (-maxVy, maxVy), but using (0, 2*maxVy) is simpler IMO
for (i = 0; i < n; i++)
{
    Ay[i] = rand(0..SumY);
    SumY -= Ay[i];
}
for (i = 0; i < n; i++)
{
    Ay[i] -= maxVy; // Translate the range back to (-maxVy, maxVy) from (0, 2*maxVy)
}

これで、追放ベクトルの x 成分と y 成分の両方の配列が得られました。両方の配列を反復し、要素をペアにしてベクトルを作成します (両方の配列を同じ順序で反復する必要はありません)。

注:
X がオブジェクトの速度ベクトル (緑の線) に平行になるように、計算で軸を揃えます。 • maxVy の計算は、角度maxAlphaのベクトルが生成されることを保証するものではなく、より大きな角度のベクトルが生成されないことを保証するだけです。• Ay[i] = rand(0..SumY) および Ax[i] = -rand(0..SumX) の行は、サイズ 0 のコンポーネントを持つベクトルにつながる可能性があります。これは厄介なシナリオにつながる可能性があります。そのような場合を処理します (たとえば、「rand がゼロを返す間、もう一度呼び出します」)。

于 2012-11-13T11:17:02.380 に答える