2

現在、座標系の軸をシーンにレンダリングしようとすると、いくつかの遠近法の問題に直面しています。これらの軸について、3D立方体の中心を通る3本の直交線を描画します。問題が何であるかを説明するのはかなり難しいので、それを提示する最も実証的な方法は、いくつかの写真を投稿することだと思います。

1)シーン全体の表示:ここをクリック

2)座標系の原点を拡大表示:ここをクリック

3)少しズームインすると、2つの軸が消え、もう1つの軸が何らかの理由でずれているように見えます。ここをクリックしてください。

なぜこれが発生し、どうすればそれを防ぐことができますか?

私のモデルビューと射影行列は次のようになります。

 // Set ProjectionMatrix
projectionMatrix = glm::perspective(90.0f, (GLfloat)width / (GLfloat) height, 0.0001f, 1000.f);
glBindBuffer(GL_UNIFORM_BUFFER, globalMatricesUBO);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), glm::value_ptr(projectionMatrix));
glBindBuffer(GL_UNIFORM_BUFFER, 0);

// Set ModelViewMatrix
glm::mat4 identity        = glm::mat4(1.0); // Start with the identity as the transformation matrix
glm::mat4 pointTranslateZ = glm::translate(identity, glm::vec3(0.0f, 0.0f, -translate_z)); // Zoom in or out by translating in z-direction based on user input 
glm::mat4 viewRotateX     = glm::rotate(pointTranslateZ, rotate_x, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the whole szene in x-direction based on user input
glm::mat4 viewRotateY     = glm::rotate(viewRotateX,  rotate_y, glm::vec3(0.0f, 1.0f, 0.0f)); // Rotate the whole szene in y-direction based on user input
glm::mat4 pointRotateX    = glm::rotate(viewRotateY, -90.0f, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the camera by 90 degrees in negative x-direction to get a frontal look on the szene
glm::mat4 viewTranslate   = glm::translate(pointRotateX, glm::vec3(-dimensionX/2.0f, -dimensionY/2.0f, -dimensionZ/2.0f)); // Translate the origin to be the center of the cube
4

1 に答える 1

2

それは「クリッピング」と呼ばれます。軸がクリップに近い平面に当たっているため、クリップされています。3番目の軸は「変位」していません。単に部分的にクリップされています。2番目の画像を撮り、その大部分を覆って、対角軸の一部だけが見えるようにします。それはあなたが得ているものです。

これにはいくつかの一般的な解決策があります。まず、ユーザーがそこまでズームインできるようにすることはできません。または、カメラをターゲットオブジェクトに近づけるときに、ニアクリッププレーンを内側に調整することもできます。これにより、遠くのオブジェクトの精度の問題も発生するため、遠くのクリップ平面も内側に調整することをお勧めします。

または、デプスクランプをオンにすることもできます(GL 3.x +を使用している場合、またはARB_depth_clampまたはNV_depth_clampにアクセスできる場合)。これは完璧な解決策ではありません。カメラの後ろに来ると物事がクリップされてしまうからです。また、近くのクリッププレーンと交差するものは、そのような2つのオブジェクトが重なると、適切な深度バッファリングができなくなります。しかし、それは一般的に十分です。

于 2013-01-24T20:12:49.503 に答える