使用 openGL 在 C++ 中绘制圆

Drawing a circle in c++ using openGL

我一直在尝试使用 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++ 和这个网站都很陌生。

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

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

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. 定义一个视图矩阵以考虑您的视口具有的相同比率。您没有显示如何设置 view/world 矩阵,也许您甚至没有使用矩阵...如果是这样,您可能应该使用一个。

我不明白,确切地说,你想要得到什么,但是...... 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))

那么圆心和半径呢?

(x, y)应该是圆心吧?

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.: 对不起我的英语不好

--- 根据 Rodrigo 的建议修改 --