2

2D で形状を描画しようとしています。gluProject を使用して 3D 座標と 2D 座標を変換しようとしています。基本的に、私の目標は (200,200) にポイントを描画することであり、ポイントは適切に描画されます (開始位置が 0,0,0 の場合)。

私はこのようにgluProjectを初期化しました -

GLdouble modelView[16];
GLdouble projection[16];
GLint viewport[4];
glGetDoublev(GL_MODELVIEW_MATRIX,modelView);
glGetDoublev(GL_PROJECTION_MATRIX,projection);
glGetIntegerv(GL_VIEWPORT,viewport);

そして、私はこのようなアニメーションメソッドでそれを呼び出しています

double tx, ty, tz;
gluProject(0.0,0.0,0.0,modelView,projection,viewport,&tx,&ty,&tz);
cout<<"tx,ty,tz: "<<tx<<","<<ty<<","<<tz<<endl;

私が得た値は変です (-9e61、-9e61、-9e61)。本来あるべき行列とは異なる行列を掛けているためだと思います。何かアドバイス?

4

2 に答える 2

1

私はこのようにgluProjectを初期化しました -

そこにあなたのエラーがあります。OpenGL はステート マシンです。1回限りの初期化はありません。OpenGL ステート マシンがアンプロジェクション先の状態になったときに、マトリックスとビューポートをフェッチする必要があります。たとえば、コンテキスト作成の直後にそれらを取得すると、後で取得したものとは異なる可能性がある恒等行列とビューポートが取得されます。

特定の場所にポイントを描画するだけの場合は、radical7 の回答を参照してください。

于 2013-01-21T11:27:32.250 に答える
0

示されているコードは正しいです。wglMakeCurrentコンテキストがバインドされていることを確認してください(使用しているウィンドウツールキットで、、、または同等のものを呼び出すことによってglxMakeCurrent)。そうでない場合、値(からの値を含むglGetError)は定義されません。

そうは言っても、OpenGLを十分に使用していないと思います。たとえば、次の場合:

// Set up the projection transformation to match window coordinates
glMatrixMode( GL_PROJECTION );
glOrtho2D( 0, windowWidth, 0, windowHeight );

// No modeling transformation required for this rendering
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

glColor3f( 1.0, 1.0, 1.0 );  // set the current color to white
glBegin( GL_POINTS );
glVertex2i( 200, 200 );
glEnd();

ウィンドウのピクセル(200,200)に白色点が表示されるはずです。

于 2013-01-21T00:19:16.857 に答える