2013-04-24 207 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

听起来像高宽比问题。你如何处理? – 2013-04-24 17:15:51

+0

@MichaelDorgan哦,耶稣。张贴作为答复,所以我可以接受它。 *在我身上的耻辱* – 2013-04-24 17:21:32

回答

1

使用gluOrtho2D(-WIDOWS_WIDTH,WIDOWS_WIDTH,-WINDOWS_HEIGHT,WINDOWS_HEIGHT);

通过您正在使用的固定管道在2013年有了一个顶点着色器的方式,这将是多容易理解。

+0

_How上earth_将顶点着色器,使这更容易理解?我的意思是,辞去固定管道离开是可靠的建议,但它并不能帮助一个位与投影/宽比解决问题。 – 2013-04-24 19:12:50

+0

这是一个存根。一旦其他部分稳定,我将把它转换为可编程管线。 – 2013-04-24 19:19:50

+0

@保罗 - 扬这是很难实现的,它需要更多的知识。尽管如此,在顶点着色器中使用实际的正投影矩阵使得一切都更清晰。 – felknight 2013-04-25 05:13:25

1

由gluOrtho2d定义的2D投影矩阵的长宽比必须与您正在渲染的视口/窗口相同,否则您会注意到您正在渲染的图像出现扭曲。您可以使用上述gluOrtho2d语句或写它的另一种方式是 -

浮动AR =(浮动)WINDOWWIDTH/WINDOWHEIGHT;

gluOrtho2D(-1 * ar,ar,-1,1)