У меня есть эта функция, которая рисует маленькую трехмерную систему координат оси в левом нижнем углу экрана, но в зависимости от того, что у меня перед собой, она может обрезаться.
Например, я нарисовал плоскую местность на земле, в плоскости XZ при Y = 0. Камера установлена на 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();
}
Предложения