我需要为我的网格工具包编写一个简单的可视化工具。我正在使用的对象始终位于 [-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 函数,并且在每次调整可视化控件的大小后,在每次重绘时调用 PolarView 函数,其中某些角度和距离大于 3 的平方根(真的很重要吗?)。该代码适用于立方体或球体等凸面对象,但圆环对象存在一些问题(有些面是通过其他人看到的),所以我相信这是关于深度测试的东西。我的设置有什么问题?截图:
我在互联网上进行了一些搜索,发现如果我的近平面和远平面参数有问题,就会出现这样的问题。在我的情况下,这些的正确值是什么?我的绘图过程如下:
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 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
};
我找到了一些解决此问题的方法:
- 为我的近平面和远平面交换值
- 设置
glDepthFunc
为GL_GREATER
和glClearDepth
确定0
,如果有偶数个错误,我的代码将正常工作。但是第一个错误在哪里?