2012-02-07 3 views
0

Для части курсовой работы мы должны построить рабочую модель солнечной системы. У меня есть мои планы с планетами (сферами), но мы также должны рисовать ось планеты как линию сверху и снизу.OpenGL Рисунок «ось»

Я нахожу, что использование GL_LINES, похоже, не работает, по-видимому, из-за масштаба этого проекта (радиус планет 139000000+).

Упрощенный пример:

void drawAxis(int n) 
{ 
    /* Draws the axis for body "n" */ 
    glColor3f(1.0,0.0,0.0); 
    glBegin(GL_LINES); 
    glVertex3f(0, bodies[n].radius, 0); 
    glVertex3f(0, bodies[n].radius*2, 0); 
    glEnd(); 

    glColor3f(0.0,1.0,0.0); 
    glBegin(GL_LINES); 
    glVertex3f(0, -bodies[n].radius, 0); 
    glVertex3f(0, -bodies[n].radius*2, 0); 
    glEnd(); 
} 

void drawBody(int n) 
{ 

    if(n==0) { 
    /* Draws body "n" */ 
    //glRotatef(bodies[n].axis_tilt, 1.0, 0.0, 0.0); 

    //Scale and position 
    glTranslatef(0.0, 0.0, 0.0); 
    glScalef(SCALE,SCALE,SCALE); //why already scaled? 

    //Axis 
    drawAxis(n); 

    //r g b - colour (red, green, blue) 
    glColor3f(bodies[n].r,bodies[n].g,bodies[n].b); 

    //radius - size of body (km) 
    glutSolidSphere (bodies[n].radius/SCALE, 50, 50); 
    } 
} 

Ничьи:

SolarSystem

Я пропускаю что-то критическое здесь?

Какая лучшая «работа вокруг» для рисования оси на этой сфере?

+5

«радиус планет 139000000+» Почему? Почему не радиус планеты 1.39? Масштаб OpenGL - это то, что * вы * хотите, чтобы это было. Это не метры, сантиметры, футы, мили, километры или что-то еще. Это именно то, что вы хотите. Поэтому выбирайте масштаб, чтобы он делал вещи самыми легкими для вас. –

+0

Я думал, что это просто, не имеет значения, поэтому, чтобы облегчить мой файл данных, он остался в KM –

+0

Привет, Pez, как говорит Николь, масштаб вызывает проблему. Как вы сказали сами, линия не имеет «ширины», так сказать, но это означает, что вы делаете что-то бесконечно маленькое, пытаясь поместить несколько сотен тысяч километров в одну камеру. Не удивительно, что бесконечно тонкая линия не отображается;) –

ответ

2
glScalef(SCALE,SCALE,SCALE); //why already scaled? 

... 

glutSolidSphere (bodies[n].radius/SCALE, 50, 50); 

Это не имеет никакого смысла. Зачем вам применять единую шкалу, только чтобы разделить ее сферу своей сферы, тем самым отменив масштаб? Разве не имело бы смысла иметь никакого масштаба вообще и просто использовать bodies[n].radius?

Это источник вашей проблемы. Смотрите, вы отмените ненужную шкалу, когда вы нарисуете свою сферу, но вы не отмените ее, когда вы нарисуете свои топоры. Если вы выберете ненужный масштаб, есть лучший шанс, что он сработает.

+0

Это не объясняет, почему ось не существует? Я пытался масштабировать, прежде чем я понял, что линия не будет затронута масштабом (так как это всего лишь две точки). –

+0

Удаление этого не похоже на проблему, спасибо за идею, хотя –

+0

@PezCuckow: Да, это делает разница. Поскольку вы не сделали это на ваших осях, они не будут расположены на поверхности сферы. Либо используйте только glScale с радиусом единицы измерения, либо не используйте glScale, но примените масштаб геометрии. – datenwolf

Смежные вопросы