ここで最初の問題:
シミュレーション コードの .h ファイルにカウント変数を配置し、視覚化のために .cpp ファイルに格納してから、ラインで提供される HD 関数を使用して画面に出力しようとしました。
変数のスコープとコンパイル単位について自分自身に知らせてください。すぐに解決するには、ヘッダー ( .h
) ファイルの変数宣言を割り当てなしで extern に変更し、コンパイル ユニット ソース ファイルの 1 つ ( .c*
) で、理想的には初期化割り当てを使用して実際に変数を定義します。
とにかく、オンラインで機能するヘルプが見つからないため、ビジュアル画面に印刷する方法を知っている人はいますか?
HUD のニーズに合ったプロジェクションに切り替えて、シーン上にスコアを描画します。いつでもどこでも投影とビューポートを切り替えることができます。プロのヒント: ウィンドウのサイズ変更ハンドラーで射影行列を処理するコードがある場合は、それを描画コードに移動します。
コメントがあったので更新
drawText
その機能についてコメントさせてください
void drawText(float *text, int length, int x, int y)
{
glMatrixMode(GL_PROJECTION);
double *matrix = new double[16];
glGetDoublev(GL_PROJECTION_MATRIX, matrix);
射影行列 stap が glPushMatrix/glPopMatrix を使用するのに十分な深さでネストされていない可能性があるため、これは実際には理にかなっています。しかし、関数の最後に、割り当てられたメモリを解放できません。実際、静的に割り当てられた配列を使用する方が優れています。要素の数はよく知られており、スタックのメモリを取得する方がヒープよりもはるかに効率的です。
glLoadIdentity();
glOrtho(0, 800, 0, 600, -5, 5);
ここでの問題: 正投影の範囲は、ビューポートのサイズと一致する必要があります。ここではそうではありません。
glMatrixMode(GL_MODELVIEW);
次の glLoadIdentity は、プッシュ/ポップ フレーム内にないため、modelview マトリックスを破棄します。また、それは冗長です
glLoadIdentity();
必要なものは以下です。
glPushMatrix();
glLoadIdentity();
ここでの問題は、glRasterPos が頂点を放出するように動作することです。つまり、頂点がクリッピングされ (それについては何もできません)、深度がテストされます。また、glutBitmapCharacter (実際には glBitmap) が深度バッファに干渉する可能性があります。
glRasterPos2i(x, y);
for(int i=0; i<length; i++)
{
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);
}
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(matrix);
glMatrixMode(GL_MODELVIEW);
}
関数は次のように修正できます。
void drawText(float *text, int length, int x, int y)
{
double old_modelview[16];
int viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glMatrixMode(GL_PROJECTION);
glGetDoublev(GL_PROJECTION_MATRIX, old_modelview);
glLoadIdentity();
glOrtho(viewport[0], viewport[0]+viewport[2],
viewport[1], viewport[1]+viewport[3],
-1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// We're using glBitmap, i.e. legacy functionality anyway
// so we can use glPush/PopAttrib as well.
glPushAttrib(GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
glRasterPos2i(x, y);
for(int i=0; i<length; i++) {
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);
}
glPopAttrib(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(old_modelview);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}