繁体   English   中英

使用OpenGL在C ++中绘制圆

[英]Drawing a circle in c++ using openGL

我一直在尝试使用openGL在c ++中画一个圆。 到目前为止,我有一个压缩圆圈,它只有一条随机的线穿过屏幕 这是我用来获得此形状的功能。

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

我不确切地知道您想要获得什么,但是... cos()sin()收到一个光辉的参数; 所以,不是cos(i)sin(i) ,我想你需要cos((2*rad*i)/360.0))sin((2*rad*i)/360.0))或semplified, 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));
    }
}

或者,失去精确度,但避免一些赘肉,

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呢?

ps:对不起,我的英语不好。

---根据Rodrigo的建议进行了修改-

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM