10

画面の左下隅に小さな3D軸座標系を描画するこの機能がありますが、目の前にあるものによっては、クリップされる場合があります。

たとえば、Y = 0のXZ平面上に、地面に平坦な地形を描画しました。カメラはY = 1.75に配置されています(平均的な人の身長をシミュレートするため)。見上げている場合は正常に機能し、見下ろしている場合はグランドプレーンにクリップされます。

見上げる: http: //i.stack.imgur.com/Q0i6g.png
見下ろす:http://i.stack.imgur.com/D5LIx.png

コーナーに軸システムを描画するために呼び出す関数は次のとおりです。

void Axis3D::DrawCameraAxisSystem(float radius, float height, const Vector3D rotation) {
    if(vpHeight == 0) vpHeight = 1;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0, vpWidth, vpHeight);
    gluPerspective(45.0f, 1.0 * vpWidth / vpHeight, 1.0f, 5.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0.0f, 0.0f, -3.0f);

    glRotatef(-rotation.x, 1.0f, 0.0f, 0.0f);
    glRotatef(-rotation.y, 0.0f, 1.0f, 0.0f);

    DrawAxisSystem(radius, height);
}

今、私が思ういくつかの主な機能が問題に関連していると思います:

glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);

void changeSize(int width, int height) {
    if(height == 0) height = 1;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glViewport(0, 0, width, height);

    gluPerspective(60.0f, 1.0 * width / height, 1.0f, 1000.0f);

    glMatrixMode(GL_MODELVIEW);
}

void renderScene(void) {
    glClearColor(0.7f, 0.7f, 0.7f, 0.0f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    changeSize(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));

    glLoadIdentity();

    SceneCamera.Move(CameraDirection, elapsedTime);
    SceneCamera.LookAt();

    SceneAxis.DrawCameraAxisSystem(0.03f, 0.8f, SceneCamera.GetRotationAngles());

    glutSwapBuffers();
}

提案?

4

5 に答える 5

23

深度テストを無効にするglClear(GL_DEPTH_BUFFER_BIT);のではなく、オーバーレイをレンダリングする直前に無効にすることができます。その後、そこにあった深度情報はすべてなくなりますが、ピクセルはすべてまだそこにあります。ただし、オーバーレイは引き続き適切にレンダリングされます。

于 2011-04-03T02:52:02.987 に答える
4

3D軸の深度範囲を少し予約することもできます。そして、あなたのシーンの残りすべて。このような:

// reserve 1% of the front depth range for the 3D axis
glDepthRange(0, 0.01);

Draw3DAxis();

// reserve 99% of the back depth range for the 3D axis
glDepthRange(0.01, 1.0);

DrawScene();

// restore depth range
glDepthRange(0, 1.0);
于 2015-03-02T23:05:51.490 に答える
0

深度テストを無効にしたい(つまり、何にもクリップされないようにする):

glDisable(GL_DEPTH_TEST);

また、ポイントを事前に変換した場合(実際にはそうではないようです)、ビューと投影の行列を同一に設定します。

編集:

軸ビットをテストして順番に維持する必要がある場合は、軸ビットとglClear(GL_DEPTH_BUFFER_BIT)メインシーンのレンダリングの間の深度バッファー()をクリアすることをお勧めします。これにより、デプスバッファがリセットされ、マーカーが描画されます(したがって、前面に表示されます)が、適切にカリングされます。

于 2011-04-03T01:32:48.320 に答える
0

ブレンディングを有効にしてから、フラグメントシェーダーでアルファとカラーを手動で設定してみてください。しかし、それはやり過ぎかもしれません;-)

于 2011-04-03T02:58:53.183 に答える
0

`glGetBooleanv(GL_BLEND、&m_origin_blend);

glGetBooleanv(GL_DEPTH_TEST、&m_origin_depth);

glGetBooleanv(GL_CULL_FACE、&m_origin_cull);

setAlphaBlending(true);

setDepthTest(false);

setCullFace(false); //石で

//あなたのdraw()..。

setAlphaBlending(m_origin_blend> 0?true:false);

setDepthTest(m_origin_depth> 0?true:false);

setCullFace(m_origin_cull> 0?true:false); `

于 2015-03-24T23:42:12.140 に答える