3

3DシーンをレンダリングするQGLWidgetのサブクラス「GLWidget」があります。回転してズームできます。

QTimer私は次の関数で呼び出します:

void GLWidget::processCurrent()
{
    draw();
    printStats();
    glFlush();
    swapBuffers();
}

そしてメインのOpenGLレンダリング関数" draw()"は:

void GLWidget::draw()
    {
      if (isDisplayFirst)
      {
        isDisplayFirst = false;
        glViewport(0, 0, w_width, w_height);

        glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
        glLoadIdentity(); // Reset The Projection Matrix

        glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
        glLoadIdentity(); // Reset The Modelview Matrixi

        gluPerspective(45.0f, (float)w_width / w_height, g_nearPlane, g_farPlane);
        gluLookAt (0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
        glScalef(0.03f, 0.03f, 0.03f);
      }

      rotateScene();

      glClearColor(0.0 ,0.0, 0.0, 0.0);
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

      glEnable(GL_POINT_SPRITE);
      glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
      glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_NV);

      glEnable(GL_BLEND);
      glBlendFunc (GL_SRC_ALPHA, GL_ONE);

      GLuint vbo_disk = 0;

        glBindBuffer(GL_ARRAY_BUFFER, vbo_disk);
        glVertexPointer(4, GL_DOUBLE, 4*sizeof(double), Galaxy->pos);
        glEnableClientState(GL_VERTEX_ARRAY);

        glColor4f(1.0f, 1.0f, 1.0f, 0.2f);
        glDrawArrays(GL_POINTS, 0, Galaxy->getNumParticles_disk());

        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glDisableClientState(GL_VERTEX_ARRAY);

        glDisable(GL_BLEND);
        glDisable(GL_POINT_SPRITE);
    }

このGLWidgetに" printStats()"関数を使用して2Dテキスト(統計)を既にレンダリングしました。この3Dシーンに「2Dスケールライン」を描きたいと思います。

私は次のことを行うことでこの線を引くことに成功しましたprintStats()

 glDisable(GL_TEXTURE_2D);
  glColor3f(1.0f, 1.0f, 1.0f);
  glLineWidth(3.0f);
  glBegin(GL_LINES);
  glVertex2d(5, 40);
  glVertex2d(20, 40);
  glEnd();
  glEnable(GL_TEXTURE_2D);

しかし、私の問題は、回転やズームを行うと、この線が3Dシーンとともに移動することです。

3Dオブジェクトで操作を実行できるようにしながら、この2Dラインをロックする方法は何ですか?

オーバーライドで「overpainting」を使用することは避けたいですpaintEvent

また、glPush / Pop Matrixを使用しようとしていますが、2Dと3Dの間に競合があります。

それを得るために私にいくつかのアドバイスをいただけますか?

4

1 に答える 1

3

HUD機能、原則として3Dシーンを通常どおりに描画するために必要な機能を実装しようとしています。次に、再利用するすべてのOpenGL状態をバックアップし、またはを使用して新しい投影マトリックスを設定しgluOrtho2DますglOrtho。さらに、深度チェックをオフにします。

関数を呼び出した後、ortho画面スケールで描画する可能性が高いため、それに応じて線のサイズを計算する必要があります。ハッドが終わったら、変更をスタックからポップして、もう一度描画できるようにします。

OpenGlHUDの描画を扱うstackoverflowに関するいくつかの質問があります

そしてgamedevフォーラムでかなりまともな議論

于 2013-01-02T03:21:53.203 に答える