0

ビューポートをクリックすると現在いくつかの線を描画しているC++プロジェクトを変更しようとしています。この機能はまったく問題ありませんが、変更しようとしているのは、「上」または「下」キーをクリックして次の行の色を変更することです。現在、これらのキーをクリックすると、古い線(すでに描画されている)を含むすべての線の色が変わります。

どうしたらいいか教えてください。コードの一部を次に示します。

void drawPrimitive() {
Vertex *temp;

//  Set the primitive color
glColor3fv(primitiveColor);

//  Set the point size in case we are drawing a point
if (type == POINT)
    glPointSize(pointSize);

//  Display results depending on the mode
glBegin(mode);
    for(temp = head; temp != NULL; temp = temp->np)
    {
        if (smoothShading)
            glColor3f(temp->r, temp->g, temp->b);

        glVertex2f(temp->x, temp->y);
    }
glEnd(); }


void mouse(int button, int state, int x, int y) {
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
    float pointX, pointY;

    pointX = (float)x/window_width * world_width;
    pointY = (float)(window_height - y)/window_height * world_height;

    //  Add a vertex to the list of vertices...
    addVertex(&head, &tail, pointX, pointY, 0.0f, primitiveColor[0], primitiveColor[1], primitiveColor[2]);

    //  automatically calls the display function
    glutPostRedisplay();
}
else if(button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)
{
    deleteVertex(&head, &tail);
    glutPostRedisplay();
} }


void special(int key, int x, int y) {
switch (key)
{
    //  change primitive color
    case GLUT_KEY_UP :
        changePrimitiveColor(1);
        break;
    case GLUT_KEY_DOWN :
        changePrimitiveColor(-1);
        break;
}

glutPostRedisplay(); }


void changePrimitiveColor(int step) {
primitiveColorId += step;

if (primitiveColorId < 0)
    primitiveColorId = COLOR_COUNT - 1;

if (primitiveColorId >= COLOR_COUNT)
    primitiveColorId = 0;

setColor(primitiveColor, primitiveColorId); }
4

2 に答える 2

0

あなたのコードはちょっと不明瞭です。primitiveColorはグローバル変数ですか?

再描画するたびにすべての線に対してdrawPrimitive()を呼び出すと仮定すると、すべての線に同じprimitiveColorが使用されます。上または下を押して色を変更するとすぐに再表示機能が呼び出され、すべての線が同じ色で再描画されます。

あなたがしたいと思うかもしれないことは、プリミティブとそれぞれの色の両方を含むリストを持っていることです。このリストを繰り返すときに、各行の色を設定できます。

于 2012-06-04T17:42:48.867 に答える
0

OpenGLはステートマシンのように動作することに注意してください。色を設定すると、それ以降に描画するものはすべてその色で描画されます。OpenGLは、他の要素の色が異なることを認識しないため、そのように維持する必要があります。あなたは簿記をしなければなりません。

したがって、コンテンツを描画するたびに、どの要素がどの色であるかを明示的に指定する必要があります。

于 2012-06-04T17:43:14.250 に答える