Переход между сферическими координатами (OpenGL, C ++, GLUT) - PullRequest
0 голосов
/ 22 марта 2012

Я определил 2 точки на поверхности сферы, используя сферические координаты.

// define end point positions
float theta_point_1 = (5/10.0)*M_PI;
float phi_point_1 = (5/10.0)*2*M_PI;
float x_point_1 = Radius * sin(theta_point_1) * cos(phi_point_1);
float y_point_1 = Radius * sin(theta_point_1) * sin(phi_point_1);
float z_point_1 = Radius * cos(theta_point_1);

float theta_point_2 = (7/10.0)*M_PI;
float phi_point_2 = (1/10.0)*2*M_PI;
float x_point_2 = Radius * sin(theta_point_2) * cos(phi_point_2);
float y_point_2 = Radius * sin(theta_point_2) * sin(phi_point_2);
float z_point_2 = Radius * cos(theta_point_2);


// draw end points
void end_points ()
{
    glColor3f (1.0, 1.0, 1.0);
    glPointSize(25.0);
    glBegin(GL_POINTS);
    glVertex3f(x_point_1,y_point_1,z_point_1);
    glVertex3f(x_point_2,y_point_2,z_point_2);
    glEnd();
}

Для перехода между двумя точками я делаю следующее:

  1. найдитеразницу между theta_points_1,2 и phi_points_1,2
  2. разделите различия на 'n' (получая 's')
  3. перерисовайте 'n' раз, увеличивая тета и фи на s'каждый раз

Далее я определил различия между моими значениями тэты и фи, разделил их и затем перерисовал.

// begining spherical coords
float theta_point_1_value=5;
float phi_point_1_value=5;

// ending sperical coords
float theta_point_2_value=7;
float phi_point_2_value=1;

// dividing the difference evenly
float step_points=30;
float step_theta = 2/step_points;
float step_phi = 4/step_points;

// step between spherical coordinates
void stepping_points ()
{
    glColor3f (1.0, 0.0, 0.0); 
    for (int i = 1; i < step_points; i++)
    {
        float theta = (theta_point_1_value/10.0)*M_PI;
        float phi = (phi_point_1_value/10.0)*2*M_PI;
        float x = Radius * sin(theta) * cos(phi);
        float y = Radius * sin(theta) * sin(phi);
        float z = Radius * cos(theta);  
        glPushMatrix();         
        glTranslatef(x,y,z);
        glutSolidSphere (0.05,10,10);
        glPopMatrix(); 
    }  
    glEnd();
}

Теперь я понимаю,это отображает 30 твердых сфер в той же позиции.Потому что я НЕ включил «step_theta» или «step_phi» ни в одну из перерисовок.

И это корень моего вопроса.Как мне использовать «step_theta» и «step_phi» в моих перерисовках?

Что я хочу сделать, это сказать что-то вроде этого в верхней части моего цикла for:

    for (int i = 1; i < step_points; i++)
    {
        float theta_point_1_value = (theta_point_1_value+step_theta);
        float phi_point_1_value = (phi_point_1_value+step_phi);

        float theta = (theta_point_1_value/10.0)*M_PI;
        float phi = (phi_point_1_value/10.0)*2*M_PI;
        float x = Radius * sin(theta) * cos(phi);
        float y = Radius * sin(theta) * sin(phi);
        float z = Radius * cos(theta);  
        glPushMatrix();         
        glTranslatef(x,y,z);
        glutSolidSphere (0.05,10,10);
        glPopMatrix(); 
    } 

Выше будет перерисовать 30 сплошных сфер, но они не отображаются между моими определенными конечными точками.Совершенно очевидно, что моя математика или синтаксис ошибочны (или, скорее всего, оба так).

Ответы [ 2 ]

0 голосов
/ 04 марта 2013

Если вы хотите иметь согласованное время независимо от частоты кадров, вам необходимо отслеживать ход времени и использовать его для контроля того, как далеко вы интерполируете между двумя точками. Запомните время начала и рассчитайте желаемое время окончания, затем для каждого кадра вычислите (float)(now-start)/(end-start). Это даст вам значение от 0,0 до 1,0. Умножьте это значение на дельту каждой сферической координаты и добавьте их начальные углы, и вы получите то, какими углами вы должны быть сейчас.

0 голосов
/ 22 марта 2012

Подсказка: каков диапазон вашей переменной цикла, i? Что вы хотите, чтобы диапазон ваших step_theta и step_phi был?

Когда вы объявляете переменную внутри цикла, она выходит из области видимости и уничтожается после каждой итерации. Таким образом, между итерациями цикла изменяется только значение i.

Также: рассмотрите возможность использования векторного / точечного класса. (x_point_1, y_point_1) не является C ++:).

...