0

球面座標を使用して、球面の周りに円弧を描いています。これが私のコードです:

    int goose1a_egg1_step = 0; // THIS IS INCREMENTED EACH FRAME
    float goose1a_egg1_theta=7.5; // START THETA
    float goose1a_egg1_phi=4; // START PHI
    float goose1a_egg1_theta_increment = 1.5/goose1a_egg1_divider; // END THETA = 6
    float goose1a_egg1_phi_increment = 3/goose1a_egg1_divider; // END PHI = 1

    float goose1a_egg1_theta_math1 = (goose1a_egg1_theta-(goose1a_egg1_theta_increment* r_goose1a_egg1_step))/10.0*M_PI;
    float goose1a_egg1_phi_math1 = (goose1a_egg1_phi-(goose1a_egg1_phi_increment* r_goose1a_egg1_step))/10.0*2*M_PI;
    r_goose1a_egg1_x = radius_egg_pos * sin(goose1a_egg1_theta_math1) * cos(goose1a_egg1_phi_math1);
    r_goose1a_egg1_y = radius_egg_pos * sin(goose1a_egg1_theta_math1) * sin(goose1a_egg1_phi_math1);
    r_goose1a_egg1_z = radius_egg_pos * cos(goose1a_egg1_theta_math1);  

    glPushMatrix();
    glTranslatef(r_goose1a_egg1_x,r_goose1a_egg1_y,r_goose1a_egg1_z);
    glColor3f (1, 1, .8);
    glutSolidSphere (0.02,5,5);
    glEnd();
    glPopMatrix();

同じ START と END の位置を持つ追加の円弧を描きたいと思います。問題は、2 番目の円弧を最初の円弧とまったく同じ軌跡をたどらせるのではなく、円弧に変動性があるように数学を調整できるかということです。たとえば、2 番目のアークは、最初のアークからわずかに分岐したパスを移動します。DFW から JFK に向かう 2 つのフライトのようですが、ルートが少し異なります。

2 番目の弧のコードは次のとおりです (注: この 2 つの違いは「goose1a」と「goose1b」だけです。ここでは、ランダム変数にランダム整数をランダムに乗算していた大量のクラフトを追加したくありません。 :/ )

    int goose1b_egg1_step = 0; // THIS IS INCREMENTED EACH FRAME
    float goose1b_egg1_theta=7.5; // START THETA
    float goose1b_egg1_phi=4; // START PHI
    float goose1b_egg1_theta_increment = 1.5/goose1b_egg1_divider; // END THETA = 6
    float goose1b_egg1_phi_increment = 3/goose1b_egg1_divider; // END PHI = 1

    float goose1b_egg1_theta_math1 = (goose1b_egg1_theta-(goose1b_egg1_theta_increment* r_goose1b_egg1_step))/10.0*M_PI;
    float goose1b_egg1_phi_math1 = (goose1b_egg1_phi-(goose1b_egg1_phi_increment* r_goose1b_egg1_step))/10.0*2*M_PI;
    r_goose1b_egg1_x = radius_egg_pos * sin(goose1b_egg1_theta_math1) * cos(goose1b_egg1_phi_math1);
    r_goose1b_egg1_y = radius_egg_pos * sin(goose1b_egg1_theta_math1) * sin(goose1b_egg1_phi_math1);
    r_goose1b_egg1_z = radius_egg_pos * cos(goose1b_egg1_theta_math1);  

    glPushMatrix();
    glTranslatef(r_goose1b_egg1_x,r_goose1b_egg1_y,r_goose1b_egg1_z);
    glColor3f (1, 1, .8);
    glutSolidSphere (0.02,5,5);
    glEnd();
    glPopMatrix();

私の 3D 数学の理解は非常に貧弱なので、これを行う方法があるかどうかさえわかりません。そうでない場合は、自分の設計に対する代替ソリューションを探します。しかし、球座標を使用して同じ START および END 位置を使用する 2 つの異なる円弧を描くことが可能であれば、アドバイスとガイダンスを大いに歓迎します。

4

1 に答える 1

1

球面座標で B スプラインを計算してみることができます。各終点に 2 つのノットを配置し、中央に 1 つのノットを配置して (最短の円弧に垂直に) 押して変動性を調整します。

Aからまでの最短円弧を計算していると思いますがB、点が正反対でない限り、最短円弧は 1 つしかありません。したがって、直線ではなく球状空間の曲線が必要です。


別のアプローチを取ると、球面上の 2 点を結ぶ直接経路は、球とそれらの 2 点を通る平面との交点であることに注意してください。これらの 2 点間で形成される軸を中心にその平面を回転させることができれば、交点は別の円弧になります。

トリックはそれらを計算することです。平面と球体の交差を読んでください。数式は楕円形のセクションである必要があるため、それほど悪くはないかもしれません。そうすれば、球座標は必要ありません。

于 2013-01-30T21:30:39.750 に答える