2013-04-24 2 views
1

Я пытаюсь нарисовать круг в opengl, но я не могу получить правильные координаты, поэтому я всегда получаю многоточие независимо от того, какой метод я использую. Текущий код выглядит следующим образом:Образец круга OpenGL, получающий эллипс

void Ball::Render() { 
    float center_position_x = _body->GetWorldCenter().x; 
    float center_position_y = _body->GetWorldCenter().y; 
    float radius = static_cast<b2CircleShape*>(_body->GetFixtureList()->GetShape())->m_radius; 

    glBegin(GL_LINE_STRIP); 
     for(float angle = 0; angle <= 360; ++angle) { 
      float angleInRadians = glm::radians(angle); 
      float x = glm::cos(angleInRadians); 
      float y = glm::sin(angleInRadians); 

      glVertex3f(x,y,0); 
     } 
    glEnd(); 
} 

(я знаю, что код должен нарисовать круг в нуле, но даже тогда это не идеальный круг, если я правильно понял, что должен нарисовать круг в начале координат с радиусом = 1)

других методов я использовал были: http://slabode.exofire.net/circle_draw.shtml http://www.opengl.org/discussion_boards/showthread.php/167955-drawing-a-smooth-circle

Это мой OpenGL коды окна настройки (Это незавершенная программа так что я, начиная с закодированными значениями): gluOrtho2D(-10, 15, -10, 15);

+3

Звучит как проблема соотношения сторон. Как вы справляетесь с этим? –

+0

@MichaelDorgan Oh jesus. опубликуйте это как ответ, чтобы я мог его принять. * стыд на мне * –

ответ

1

Используйте gluOrtho2D (-WIDOWS_WIDTH, WIDOWS_WIDTH, -WINDOWS_HEIGHT, WINDOWS_HEIGHT);

Кстати, вы используете стационарный трубопровод в 2013 году. С вершинным шейдером это было бы очень легко понять.

+0

_Как на земле_ будет ли вершинный шейдер сделать это проще для понимания? Я имею в виду, что отход от фиксированного конвейера является солидным советом, но это не помогает решить проблему с проекцией/соотношением сторон. –

+0

Это заглушка. Я буду преобразовывать его в программируемый конвейер, как только остальные части будут твердыми. –

+0

@ Paul-Jan Это сложнее реализовать, и для этого требуется больше знаний. Тем не менее использование реальной матрицы ортографической проекции внутри вершинного шейдера делает все более ясным. – felknight

1

Соотношение сторон вашей 2D-проекционной матрицы, определяемое gluOrtho2d, должно быть таким же, как и окно просмотра/окна, на котором вы рендереваете, иначе вы заметите искажения на рисунках, которые вы визуализируете. Вы можете использовать вышеуказанный оператор gluOrtho2d или другой способ его написания -

float ar = (float) WindowWidth/WindowHeight;

gluOrtho2D (-1 * ар, ар, -1, 1)

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