使用openGL在c ++中绘制一个圆圈

时间:2016-05-08 17:14:26

标签: c++ opengl sdl sdl-2

我一直在尝试使用openGL在c ++中绘制一个圆圈。 So far i have a compresses circle and it just has a random line going across the screen。 这是我用来获得这种形状的功能。

void Sprite::init(int x, int y, int width, int height, Type mode, float scale) {
    _x = x;
    _y = y;
    _width = width;
    _height = height;
    //generate buffer if it hasn't been generated
    if (_vboID == 0) {
        glGenBuffers(1, &_vboID);
    }
    Vertex vertexData[360];
    if (mode == Type::CIRCLE) {
        float rad = 3.14159;
        for (int i = 0; i < 359; i++) {
            vertexData[i].setPosition((rad * scale) * cos(i), (rad * scale) * sin(i));
        }
    }

    //Tell opengl to bind our vertex buffer object
    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
    //Upload the data to the GPU
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);

    //Unbind the buffer
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

造成这条线的原因是什么?为什么我的圆圈被压缩了?

很抱歉,如果这是一个愚蠢的问题,或者如果这个问题不属于这个网站,我对c ++和本网站都很新。

2 个答案:

答案 0 :(得分:2)

如果不自行测试代码很难确定,但无论如何我都会猜测。

您的奇怪行可能是由于缓冲区未完全初始化造成的。这是错的:

Vertex vertexData[360];
for (int i = 0; i < 359; i++) {

应该是:

for (int i = 0; i < 360; i++) {

或者vertexData[359]处的位置未初始化并且包含一些遥远的点。

关于椭圆而不是圆,这可能是由于视口在水平和垂直方向上没有相同的比例。如果将视口加转换矩阵配置为具有X = -10..10的视锥体,Y = -10..10,但实际视口为X = 0..800且Y = 0..600,例如,那么比例会有所不同,你会让你的图像失真。

解决方案将是以下之一:

  1. 创建方形视口而不是矩形。检查glViewport()
  2. 的参数
  3. 定义视图矩阵以考虑视口具有的相同比率。你没有展示如何设置视图/世界矩阵,也许你甚至没有使用矩阵......如果是这种情况,你应该使用矩阵。

答案 1 :(得分:0)

我完全不明白你想要获得的东西,但...... cos()sin()会得到一个容光焕发的论点;所以,我认为您需要cos(i)sin(i)或者简化,cos((2*rad*i)/360.0))sin((2*rad*i)/360.0))

,而不是cos((rad*i)/180.0))cos((rad*i)/180.0))

那个圆圈的中心和周围怎么样?

xy)应该是圈子的中心?

scale是多么神奇?

在这种情况下,我想你应该写一些(警告:未经测试)

Vertex vertexData[360];
float  rad = 3.14159;
if (mode == Type::CIRCLE) {
    for (int i = 0; i < 359; ++i) {
        float  angle = (rad / 180) * i; // (thanks Rodrigo)
        vertexData[i].setPosition(x + scale * cos(angle), y + scale * sin(angle));
    }
}

或者,失去精确度,但要避免一些moltiplication,

Vertex vertexData[360];
float  rad = 3.14159;
float  angIncr = rad / 180.0;
if (mode == Type::CIRCLE) {
    for (int i = 0, float angle = 0.0; i < 359; ++i, angle += angIncr) {
        vertexData[i].setPosition(x + scale * cos(angle), y + scale * sin(angle));
    }
}

但是widthheigth呢?

p.s:抱歉我的英语不好。

---根据罗德里戈的建议修改 -