0

オブジェクトを含む 3D シーンがあり、現在見ている画面とは異なるオブジェクトのビューを保存したいと考えています。だから私は次のようなことをしなければならないと思った(疑似コード):

PushMatrix()
LoadIdentity()
TranslateAndRotate()
gluperspective()
setViewport()
DrawScene()
saveScreenshot()
PopMatrix()

しかし、指定したものではなく、カメラの現在のビューの写真しか取得できません。私は何かを忘れましたか?

編集:以下の回答のため、次のコードを試しました:

void ScenePhotograph(GLubyte* Target, float *Translation, float RotationAroundY)
{
    glMatrixMode(GL_PROJECTION);
    gluPerspective(54.0f, (GLfloat)openGLControl1->Width / (GLfloat)openGLControl1->Height, 1.0f, 3000.0f);
    glViewport(0,0,openGLControl1->Width, openGLControl1->Height);
    glMatrixMode(GL_MODELVIEW);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();   
    glTranslatef(Translation[0],Translation[1],Translation[2]);
    glRotatef(RotationAroundY, 0,1,0);
    openGLControl1_OnDrawGL(NULL,System::EventArgs::Empty);
    openGLControl1->Refresh();
    glReadPixels(0, 0, openGLControl1->Width, openGLControl1->Height, GL_RGB, GL_UNSIGNED_BYTE, Target);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();   
    cam->SetView();
    openGLControl1_OnDrawGL(NULL,System::EventArgs::Empty);
    openGLControl1->Refresh();
    glutSwapBuffers();
}

これにより、glutSwapBuffers(); でアクセス違反が発生します。何か案は?

4

1 に答える 1

2

まず、コード内に異なるマトリックスが混在していないことを確認してください。スクリーンショットを取得するには、通常どおり画面に表示するようにカメラを正確に配置する必要がありますが、バッファーを交換する前に、現在のフレームバッファーからピクセルを読み取り、画像として保存します。

したがって、必要なのは次のようなものです。

glMatrixMode(GL_PROJECTION);
gluPerspective();
glMatrixMode(GL_MODELVIEW);
glClear(); // clear buffers here
loadIdendity();
setCameraPosition();
TranslateRotate();
DrawScene();
screenShot();

// do again to set your camera to correct position
glClear(); // clear buffers here
loadIdendity();
setCameraPosition();
TranslateRotate();
DrawScene();
swapBuffers();

ご覧のとおり、screenShot は現在のフレーム バッファからピクセルを読み取り、画像として保存します。すべてをやり直して、カメラを正しい場所に配置します

于 2013-05-09T13:56:03.450 に答える