用c+绘制一个圆+;使用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); } void Sprite::init(int x,int y,int width,int height,Type mode,float scale){ _x=x; _y=y; _宽度=宽度; _高度=高度; //如果尚未生成缓冲区,则生成缓冲区 如果(_vboID==0){ glGenBuffers(1,&u vboID); } 顶点顶点顶点数据[360]; if(mode==Type::CIRCLE){ 浮点数rad=3.14159; 对于(int i=0;i

用c+绘制一个圆+;使用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); } void Sprite::init(int x,int y,int width,int height,Type mode,float scale){ _x=x; _y=y; _宽度=宽度; _高度=高度; //如果尚未生成缓冲区,则生成缓冲区 如果(_vboID==0){ glGenBuffers(1,&u vboID); } 顶点顶点顶点数据[360]; if(mode==Type::CIRCLE){ 浮点数rad=3.14159; 对于(int i=0;i,c++,opengl,sdl,sdl-2,C++,Opengl,Sdl,Sdl 2,是什么引起了这条线?为什么我的圈子被压缩了 对不起,如果这是一个愚蠢的问题,或者这个问题不属于这个网站,我对C++和这个网站都是新的。 不必自己测试代码就很难确定,但无论如何我都会猜到。 奇怪的行可能是由于缓冲区未完全初始化造成的。这是错误的: Vertex vertexData[360]; for (int i = 0; i < 359; i++) { 顶点顶点数据[360]; 对于(int i=0;i

是什么引起了这条线?为什么我的圈子被压缩了


对不起,如果这是一个愚蠢的问题,或者这个问题不属于这个网站,我对C++和这个网站都是新的。

不必自己测试代码就很难确定,但无论如何我都会猜到。 奇怪的行可能是由于缓冲区未完全初始化造成的。这是错误的:

Vertex vertexData[360];
for (int i = 0; i < 359; i++) {
顶点顶点数据[360];
对于(int i=0;i<359;i++){
应该是:

for (int i = 0; i < 360; i++) {
for(int i=0;i<360;i++){
或者,
vertexData[359]
处的位置未初始化,并包含一些较远的点

关于椭圆而不是圆,这可能是由于视口在水平和垂直方向上没有相同的比例造成的。例如,如果将视口+变换矩阵配置为具有X=-10..10,Y=-10..10的视锥,但实际视口是X=0..800和Y=0..600,则比例将不同你的图像会被扭曲

解决办法是:

  • 创建方形视口而不是矩形视口。请将参数检查为
    glViewport()
  • 定义一个视图矩阵来考虑你的视口具有相同的比例。你不显示你如何设置视图/世界矩阵,也许你甚至不使用矩阵…如果是这样的话,你可能应该使用一个。

  • 不亲自测试代码就很难确定,但我还是会猜

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

    Vertex vertexData[360];
    for (int i = 0; i < 359; i++) {
    
    顶点顶点数据[360];
    对于(int i=0;i<359;i++){
    
    应该是:

    for (int i = 0; i < 360; i++) {
    
    for(int i=0;i<360;i++){
    
    或者,
    vertexData[359]
    处的位置未初始化,并包含一些较远的点

    关于椭圆而不是圆,这可能是由于视口在水平和垂直方向上没有相同的比例造成的。例如,如果将视口+变换矩阵配置为具有X=-10..10,Y=-10..10的视锥,但实际视口是X=0..800和Y=0..600,则比例将不同你的图像会被扭曲

    解决办法是:

  • 创建方形视口而不是矩形视口。请将参数检查为
    glViewport()
  • 定义一个视图矩阵来考虑你的视口具有相同的比例。你不显示你如何设置视图/世界矩阵,也许你甚至不使用矩阵…如果是这样的话,你可能应该使用一个。

  • 我不明白你到底想得到什么,但是…
    cos()
    sin()
    收到了一个令人振奋的论据;因此,与其说是
    cos(I)
    sin(I)
    ,不如说你需要
    cos((2*rad*I)/360.0))
    sin((2*rad*I)/360.0))
    或者,简化为
    cos((rad*I)/180.0))((rad*i)/180.0))

    那么圆的中心和半径呢

    x
    y
    )应该是圆的中心吗

    scale
    是无线电波吗

    在这种情况下,我想您应该编写如下内容(注意:未测试)

    顶点顶点数据[360];
    浮点数rad=3.14159;
    if(mode==Type::CIRCLE){
    对于(int i=0;i<359;++i){
    浮动角度=(rad/180)*i;//(感谢罗德里戈)
    顶点数据[i]。设置位置(x+比例*cos(角度),y+比例*sin(角度));
    }
    }
    
    或者,失去了精度,但避免了一些摩尔复制

    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));
        }
    }
    
    顶点顶点数据[360];
    浮点数rad=3.14159;
    浮动angIncr=rad/180.0;
    if(mode==Type::CIRCLE){
    对于(int i=0,浮动角度=0.0;i<359;++i,角度+=angIncr){
    顶点数据[i]。设置位置(x+比例*cos(角度),y+比例*sin(角度));
    }
    }
    
    但是宽度和高度呢

    p、 对不起,我的英语不好


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

    我不清楚你到底想要得到什么,但是…
    cos()
    sin()
    收到了一个令人振奋的论点;因此,我想你需要的不是
    cos(I)
    sin(I)
    ,而是
    cos((2*rad*I)/360.0))
    sin((2*rad*I)/360.0))
    or,semplified,
    cos((rad*i)/180.0))
    cos((rad*i)/180.0))

    那么圆的中心和半径呢

    x
    y
    )应该是圆的中心吗

    scale
    是无线电波吗

    在这种情况下,我想您应该编写如下内容(注意:未测试)

    顶点顶点数据[360];
    浮点数rad=3.14159;
    if(mode==Type::CIRCLE){
    对于(int i=0;i<359;++i){
    浮动角度=(rad/180)*i;//(感谢罗德里戈)
    顶点数据[i]。设置位置(x+比例*cos(角度),y+比例*sin(角度));
    }
    }
    
    或者,失去了精度,但避免了一些摩尔复制

    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));
        }
    }
    
    顶点顶点数据[360];
    浮动无线电=