Вопрос камеры OpenGL, как далеко она может отрендериться? - PullRequest
1 голос
/ 03 мая 2011

Я работаю над очень простой программой, которая рисует 2 плоскости.Плоскость земли и задняя плоскость земли.

Я пытаюсь нарисовать обе плоскости, используя эти точки, упорядоченные по координатам X, Y, Z.

плоскость фона

  • точка 1 100.000002 100.000002 100.000002
  • точка 2 -100.000002 100.000002 100.000002
  • точка 3 -50.000001 -23.000001 100.000002
  • точка 4 50.000001 -23.000001 100.000002

земля плоскости

  • точка 1 -50.000001 -23.000001 100.000002
  • точка 2 50.000001 -23.000001 100.000002
  • точка 3 0,352941 -0,352941 0,352941
  • точка 4 -0,352941 -0,352941 0,352941

Настройка My GL:

  • Подсветка OpenGL отключена.
  • Я рисую с помощью GL_QUAD в том порядке, в котором перечислены точки.
  • Я не назначил нормали поверхности к квадрам.
  • Камера центрирована в (0,0,0) с Y + как «вверх» и осью Z как глубина.

Заземленная плоскость отлично отрисовывается (просто листсерый), но фоновая плоскость вообще не отображается.Поэтому я должен спросить:

  • Должен ли я включить освещение и вычислить нормали поверхности?
  • Нужно ли возиться с камерой и / или просмотреть фрустрим, чтобы увидеть заднюю плоскость (OpenGL «падает» на расстоянии Z = 100+)?

Любая помощь приветствуется.Я использую libSDL с OpenGL.

Мой код инициализации OpenGL выглядит так:

if(SDL_Init(SDL_INIT_VIDEO) < 0) {
    return false;
}

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);   

screenptr = SDL_SetVideoMode(swidth, sheight, sbpp, VIDEO_MODE_OPTIONS);

if( screenptr == NULL) {
    return false;
}

glEnable(GL_TEXTURE_2D);

glClearColor(0,0,0,0);
glClearDepth(1.0f);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL); 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//gluPerspective(45.0f, SCREEN_WIDTH/SCREEN_HEIGHT, 0.1f, 500.0f);
//gluPerspective( 45.0f, 1.0, 0.1f, 100.0f );
//glFrustum(-500.0f, 500.0f, -500.0f, 500.f, 0.1f, 500.f);
//glFrustum(-1.0, 1.0, -1.0, 1.0, 5, 400);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

if(glGetError() != GL_NO_ERROR) {
    return false;
}

Ответы [ 2 ]

4 голосов
/ 03 мая 2011

Вам нужно взглянуть на то, где вы создаете матрицу камеры (вызов glPerspective или что-то подобное, я не использовал SDL) и установить для ближней и дальней плоскости значение, такое, чтобы все, что вы хотите, было пользователь видит дальше как ближнюю плоскость, но ближе как дальнюю плоскость. Все, что не находится между ближней и дальней плоскостями, обрезается.

Редактировать Я посмотрел, в SDL вы создаете матрицу вида следующим образом:

/* Create our projection matrix with a 45 degree field of view
 * a width to height ratio of 1.0 and view from .1 to 100 infront of us */
perspective(projectionmatrix, 45.0, 1.0, 0.1, 100.0);

Никогда не устанавливайте ближнюю плоскость в 0 (приведет к отклонению на 0) или в дальнюю плоскость к Float. Макс (может вызвать странные проблемы)

Также взгляните на это изображение усеченного вида для перспективной проекции: view frustum

2 голосов
/ 03 мая 2011

Как вы настраиваете матрицу проекции? Он должен включать в себя некоторую информацию о том, как далеко могут быть воспроизведены осведомленные вещи (часто называемые расстоянием в дальнем плане), в вашем случае это должно быть больше 100.

Вторая проблема, которая может возникнуть, заключается в том, что если вы визуализируете только лицевые четырехугольники, то если ваш четырехугольник имеет обратную сторону, он не будет отображаться.

...