17

OpenGLで線を引きたい。

 glBegin(GL_LINES);
    glVertex2f(.25,0.25);
    glVertex2f(.75,.75);
glEnd();

このコードは線を描画しますが、coordinate(10,10)からcoordinate(20,20)に線を描画したい場合はどうすればよいですか?

(.25、.25)と(.75、.75)はどういう意味ですか?

4

3 に答える 3

30

(.25、.25)と(.75、.75)は、線の始点と終点です。

(10,10)から(20,20)に線を引くには:

glBegin(GL_LINES);
    glVertex2f(10, 10);
    glVertex2f(20, 20);
glEnd();
于 2013-01-23T18:54:46.287 に答える
21

OpenGL2の場合:

の各ポイント値glVertex2fは-1から1の間で、左下は(-1、-1)、右上は(1,1)、中央は(0、0)です。

絶対点を正規化された空間にマップするには:

  • xウィンドウ幅で除算してw、0から1の範囲のポイントを取得します。

  • これに2を掛けて、0から2の範囲を取得します。

  • 1を引くと、目的の-1から1の範囲が得られます。

  • y値とウィンドウの高さについて繰り返しますh

例えば:

double x1 = 10;
double y1 = 10;
double x2 = 20;
double y2 = 20;

x1 = 2*x1 / w - 1;
y1 = 2*y1 / h - 1;

x2 = 2*x2 / w - 1;
y2 = 2*y2 / h - 1;

glBegin(GL_LINES);
    glVertex2f(x1, y1);
    glVertex2f(x2, y2);
glEnd();

OpenGL3 + の場合:プログラム可能なパイプラインを使用して線を引くことは、少し複雑です。2つのポイントを取得してGPUに送信するクラスを作成Lineし、単純なシェーダープログラムを使用してそれらを描画できます。すべてのセットアップはコンストラクターで実行でき、いくつかのアクセス関数で変更できます。

class Line {
    int shaderProgram;
    unsigned int VBO, VAO;
    vector<float> vertices;
    vec3 startPoint;
    vec3 endPoint;
    mat4 MVP;
    vec3 lineColor;
public:
    Line(vec3 start, vec3 end) {

        startPoint = start;
        endPoint = end;
        lineColor = vec3(1,1,1);
        MVP = mat4(1.0f);

        const char *vertexShaderSource = "#version 330 core\n"
            "layout (location = 0) in vec3 aPos;\n"
            "uniform mat4 MVP;\n"
            "void main()\n"
            "{\n"
            "   gl_Position = MVP * vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
            "}\0";
        const char *fragmentShaderSource = "#version 330 core\n"
            "out vec4 FragColor;\n"
            "uniform vec3 color;\n"
            "void main()\n"
            "{\n"
            "   FragColor = vec4(color, 1.0f);\n"
            "}\n\0";

        // vertex shader
        int vertexShader = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
        glCompileShader(vertexShader);
        // check for shader compile errors

        // fragment shader
        int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
        glCompileShader(fragmentShader);
        // check for shader compile errors

        // link shaders
        shaderProgram = glCreateProgram();
        glAttachShader(shaderProgram, vertexShader);
        glAttachShader(shaderProgram, fragmentShader);
        glLinkProgram(shaderProgram);
        // check for linking errors

        glDeleteShader(vertexShader);
        glDeleteShader(fragmentShader);

        vertices = {
             start.x, start.y, start.z,
             end.x, end.y, end.z,

        };
        
        glGenVertexArrays(1, &VAO);
        glGenBuffers(1, &VBO);
        glBindVertexArray(VAO);

        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices.data(), GL_STATIC_DRAW);

        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
        glEnableVertexAttribArray(0);

        glBindBuffer(GL_ARRAY_BUFFER, 0); 
        glBindVertexArray(0); 

    }

    int setMVP(mat4 mvp) {
        MVP = mvp;
        return 1;
    }

    int setColor(vec3 color) {
        lineColor = color;
        return 1;
    }

    int draw() {
        glUseProgram(shaderProgram);
        glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "MVP"), 1, GL_FALSE, &MVP[0][0]);
        glUniform3fv(glGetUniformLocation(shaderProgram, "color"), 1, &lineColor[0]);

        glBindVertexArray(VAO);
        glDrawArrays(GL_LINES, 0, 2);
        return 1;
    }

    ~Line() {

        glDeleteVertexArrays(1, &VAO);
        glDeleteBuffers(1, &VBO);
        glDeleteProgram(shaderProgram);
    }
};

でいくつかの3Dラインを初期化しLine line(vec3 ..., vec3 ...)、model-view-projectionマトリックスline.setMVP(projection * view * model)を設定しline.draw()、カメラを回転させると、次のようになります。

xyz軸

サンプルコード

注:必要なのが2D線だけの場合は、z値を0に設定してvec3終点座標を指定し、setMVP呼び出しから投影行列を削除して、カメラ位置を(0,0,0)に設定するだけです。 。上記でOpenGL2について説明したように、同じことが2D線の描画にも当てはまるため、座標をNDC空間のOpenGLに送信する必要があります。

于 2019-01-07T06:26:28.557 に答える
0

これも試してみてください。色を選択して線を調整できます。

def drawline(self, x1, y1, z1, x2, y2, z2, r=0, g=0, b=0, w=2):

    glLineWidth(w)
    glBegin(GL_LINES)
    glColor3fv((r/255, g/255, b/255))
    glVertex3fv((x1, y1, z1))
    glVertex3fv((x2, y2, z2))
    glEnd()
于 2021-09-27T16:05:39.593 に答える