2

私は発射体を作成しようとしていますが、発射するとカタパルトから発射されたかのように動作します。問題は軌道を計算することです。スターティングポジションがあります。また、ターゲットは最も近い敵です。

2d 発射体の軌道で見つけたこの式を実装しようとしましたか?

xn = x0 + v * t * cos(theta)
yn = y0 + v * t * sin(theta)

そして、これが私がそれを実装した方法です:

    float v = 70f;
    t += Gdx.graphics.getDeltaTime();
    angle -= 0.1f;
    float xn = originX + v* t * MathUtils.cosDeg(angle);
    float yn = originY + v* t * MathUtils.sinDeg(angle);
    position.set(x,y);

以下のビデオのような弾道線に沿って発射体を動かそうとしています。ターゲットはカタパルトによって決定され、最も近い敵です: https://www.youtube.com/watch?v=mwU24AuQibw

編集

private float g = 9.8f;
private float v = 50;

public void update()
{
    t = Gdx.graphics.getDeltaTime();

    float dx = originX - target.x;
    float dy = originY - target.y;

    double radi = Math.sqrt(Math.pow(v, 4) - g * (g * dx * dx + 2 * dy * v * v));
    double theta1 = Math.atan((v*v + radi) / (g * dx));
    double theta2 = Math.atan((v*v - radi) / (g * dx));

    float xn = originX + v * t * MathUtils.cos((float) theta1);
    float yn = originY + v * t * MathUtils.sin((float) theta2);

    position.add(xn,yn);

上記のコードを実行しましたが、 を使用したため、発射物が消えてしまいますadd(xn,yn)が、 を使用するset(xn, yn)と、発射物はまったく移動しません。v を変更して別の数値を試していましたが、違いはありません。また、theta1 と theta2 からも NaN 値が得られます。

最終編集

これらの式を実装するために考えられるすべての方法を試しましたが、うまくいきませんでした。代わりに別のものを作ることにしました。回答ありがとうございます。誰かがここに投稿された数式を使用できるように、このスレッドを保持します。

4

1 に答える 1

3

速度が一定であると仮定しているため(これは正しくありません。垂直に撮影してみてください。速度はある時点で0になるはずです)、時間の経過に関係なく角度が0.1変化するため、式は正しく使用されていません。

v発射体の発射速度です。theta打ち出し角です。(x0, y0)発射位置です。

VX = v * cos(theta)
VY = v * sin(theta)

正しい打ち上げ垂直および水平速度を提供します。

ここで、速度の変化は、空気摩擦と重力の 2 つの要因に依存します。とりあえず摩擦は忘れましょう。

Vxn重力を受けない。したがって、変更されません。

Vyn重力を受けます。その値は時間の関数として与えられます:

Vyn = VY + t * G
Vxn = VX

G は通常~9.8m.s-2です。

角度を測定するには、発射体が地面に当たる場所を特定する必要があります。それは(Xtarget, Ytarget)(Xt, Yt)は、時間 t が経過した後の発射体の位置です。

Xt = VX * t + x0
Yt = VY * t + 0.5 * G * t * t + y0

あなたが望むXt == XtargetYt == Ytarget

v がわかっていれば、カタパルトの発射速度がわかります。この式は、シータのみに依存します (そして t ですが、t はシータの関数として表すことができます)。

v * cos(theta) * t + x0 == Xtarget
v * sin(theta) * t + G * t * t + y0 == Ytarget

これをシータで解くと、45 度より上と下の 2 つの解が得られます。

現時点では、それを行う方法がわかりません。

編集

これを見つけましたhttp://en.wikipedia.org/wiki/Trajectory_of_a_projectile#Angle_required_to_hit_coordinate_.28x.2Cy.29

完全な式は

方式

ご覧のとおり、2 つの可能な値 (+-) があります。Xtarget と x0 の間のデルタを dx と呼びます。dy も同様です。これは次のように翻訳されます。

radi = Math.sqrt(Math.pow(v, 4) - g * (g * dx * dx + 2 * dy * v * v));
theta1 = Math.atan((v*v + radi) / (g * dx))
theta2 = Math.atan((v*v - radi) / (g * dx))

現在、通常は g = 9.8ms-2 ですが、dx が m、v が ms-1 の場合にのみ機能します。そうでない場合は、定数の値を調整する必要があります。

さらに読む、空気抵抗!http://en.wikipedia.org/wiki/Trajectory_of_a_projectile#Trajectory_of_a_projectile_with_air_resistant

于 2013-11-13T17:44:59.197 に答える