1

これは、トーラス (サテライト) を球体に配置し、球体の周りを回転させる方法です。

    int satellite_1_1_step = 0;
    int &r_satellite_1_1_step = satellite_1_1_step;
    float satellite_1_1_divider = 300;

    float satellite_1_1_theta = 6.5;
    float satellite_1_1_phi = 1;
    float satellite_1_1_theta_increment = 20/satellite_1_1_divider;
    float satellite_1_1_phi_increment = 20/satellite_1_1_divider;

    void satellite_1_1 ()
    {
            float satellite_1_1_theta_math = (satellite_1_1_theta-(satellite_1_1_theta_increment * r_satellite_1_1_step))/10.0*M_PI;
            float satellite_1_1_phi_math = (satellite_1_1_phi-(satellite_1_1_phi_increment * r_satellite_1_1_step))/10.0*2*M_PI;
            r_satellite_1_1_x = radius_exodus_pos * sin(satellite_1_1_theta_math) * cos(satellite_1_1_phi_math);
            r_satellite_1_1_y = radius_exodus_pos * sin(satellite_1_1_theta_math) * sin(satellite_1_1_phi_math);
            r_satellite_1_1_z = radius_exodus_pos * cos(satellite_1_1_theta_math);  

            glPushMatrix();
            glTranslatef(r_satellite_1_1_x,r_satellite_1_1_y,r_satellite_1_1_z);
            glColor3f(1,0,0);
            glutSolidTorus(0.04, 0.2, 10, 100);
            glEnd();
            glPopMatrix();
    }

これは、その位置を更新してインクリメントする方法です。

    void satellite_1_1_increment()
    {

    if (r_satellite_1_1_step < satellite_1_1_divider)   
        {
        ++(r_satellite_1_1_step); 
        }

    if (r_satellite_1_1_step >= satellite_1_1_divider)  
        {
        r_satellite_1_1_step = 1;  
        }
    }

つまり、私のトーラス (サテライト) は球体の周りを移動し、最初の位置に戻り、再び継続します。これは素晴らしいことです。しかし、それがたどる道は、単に球を一周するのではなく、途中で極(私が思うに)の周りをぐらつきます。

衛星がより円形の経路で球体を周回するように、私の数学に加えることができる改善はありますか?

4

2 に答える 2

1

私が最初に目にする問題はこれです:

void satellite_1_1_increment()
{
    if (r_satellite_1_1_step < satellite_1_1_divider)   
    {
        ++(r_satellite_1_1_step); 
    }

    if (r_satellite_1_1_step >= satellite_1_1_divider)  
    {
        r_satellite_1_1_step = 1;  
    }
}

ステップが最初のテストによってインクリメントされ、2 番目のテストを満たす場合、エッジ ケースで何が起こるでしょうか? すぐにリセットされるため、値が失われます。その問題を回避するには、次のように記述してください。

void satellite_1_1_increment()
{
    if (r_satellite_1_1_step >= satellite_1_1_divider)   
           r_satellite_1_1_step = 1;  
    else   ++r_satellite_1_1_step;
}

1リセット値は正しいですか?多分それはあるべき0ですか?

于 2013-01-18T00:36:10.493 に答える
0

次の最初の2行を変更しました。

    void satellite_1_1 ()
    float satellite_1_1_theta_math = (satellite_1_1_theta+(satellite_1_1_theta_increment* r_satellite_1_1_step))*M_PI;
    float satellite_1_1_phi_math = (satellite_1_1_phi-(satellite_1_1_phi_increment* r_satellite_1_1_step))*M_PI/360;

これで、衛星は赤道に沿って360度周回します。glPushMatrixの後にglRotatefを追加すると、その軸を微調整できます。

再びwallykに感謝します。--kropcke

于 2013-01-18T02:29:05.173 に答える