メッシュツールキット用の簡単なビジュアライザーを作成する必要があります。作業しているオブジェクトは常に[-1,1]^3ボックス(両端を含む)内にあるため、オブジェクトがユーザーに完全に表示されるようにする必要があります。また、ユーザーがオブジェクトの周りを「飛んでいる」ように、オブジェクトの周りでカメラを回転させる可能性も必要です。
それが私がこれをしている方法です:
static void Reshape(int w, int h)
{
glViewport(0,0,(GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float maxDistance = sqrt(2);
if (w <= h)
{
glOrtho(-maxDistance, maxDistance, -maxDistance * (GLfloat)h / (GLfloat)w,
maxDistance * (GLfloat)h / (GLfloat)w, -6.0, 6.0);
}
else
{
glOrtho(-maxDistance * (GLfloat)w / (GLfloat)h, maxDistance * (GLfloat)w / (GLfloat)h,
-maxDistance, maxDistance, -6.0, 6.0);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
static void PolarView(GLdouble distance, GLdouble twist, GLdouble elevation)
{
double centerx, centery, centerz;
double eyex, eyey, eyez;
eyex = distance * cos(-twist) * cos(elevation);
eyey = distance * sin(-twist) * cos(elevation);
eyez = distance * sin(elevation);
centerx = centery = centerz = 0;
gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, 0, 0, 1);
}
Reshape関数は初期設定中に呼び出され、ビジュアライザーコントロールのサイズを変更するたびに、3の平方根よりも大きい角度と距離でPolarView関数が再描画ごとに呼び出されます(本当に重要ですか?)。このコードは、立方体や球体などの凸型オブジェクトでは正常に機能しますが、トーラスオブジェクトでは問題が発生するため(一部の面が他の面から見える)、深度テストに関するものだと思います。セットアップの何が問題になっていますか?スクリーンショット:
インターネットで検索したところ、近距離平面と遠距離平面のパラメーターに問題がある場合に、このような問題が発生する可能性があることがわかりました。私の場合、これらの正しい値は何ですか?私の描画手順は次のようになります。
glEnable(GL_DEPTH_TEST);
glClearDepth(1);
glPolygonMode(GL_FRONT, GL_LINE); // Changing of GL_LINE to GL_FILL doesn't fixing my problem, it just changing the appearance of the model.
glClearColor(BackColor.R / 255.0f, BackColor.G / 255.0f, BackColor.B / 255.0f, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
PolarView(sqrt(3), _phi, _theta);
// .. only draws
私のPIXELFORMATDESCRIPTOR:
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
32, // Depth buffer size
0,
0,
PFD_MAIN_PLANE,
0,
0,
0,
0
};
私はこれを回避するいくつかの方法を見つけました:
- 近くの飛行機と遠くの飛行機の値を入れ替える
- [OK]に設定
glDepthFunc
するGL_GREATER
と 、エラーが偶数個でもコードは正常に機能します。しかし、最初のエラーはどこにありますか?glClearDepth
0