Почему моя область просмотра opengl es 1.1 обрезает мою геометрию? - PullRequest
1 голос
/ 08 ноября 2010

Я пытаюсь просмотреть некоторую трехмерную геометрию в пользовательском приложении для ipad, которое я пишу. Проблема, с которой я сталкиваюсь, заключается в том, что при масштабировании, панорамировании и повороте модели края обрезаются, и я не знаю, почему. Я не думаю, что это из-за ближних / дальних плоскостей отсечения, потому что я изменяю их, и ничего не происходит, это все еще отсекается. Кроме того, он делает это только в одном направлении. Другое направление делает просто отлично. Есть идеи? Матрица преобразования создается с использованием созданного мною класса arcball, но я включил только жестко закодированную матрицу представления по очевидным причинам. Жестко закодированная матрица показывает проблему просто отлично. Сцена просто отображает несколько квадратов, которые обрезаются на двух углах.

Чтобы продублировать мою проблему, создайте новый проект opengl es для iPad, затем вставьте следующий код в конец метода инициализации ES1Renderer.m перед "return self;":

glMatrixMode(GL_PROJECTION);
CGRect frame = [[UIScreen mainScreen] bounds];
glViewport(0, 0, frame.size.width, frame.size.height);
glFrustumf(-1000, 1000, -1000, 1000, 10000, 10000);

теперь замените весь метод рендеринга следующим:

static const GLfloat squareVertices[] = {
-0.5f,  -0.5f,
0.5f,  -0.5f,
-0.5f,   0.5f,
0.5f,   0.5f,
};

[EAGLContext setCurrentContext:context];

glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);

glClearColor(0.5f, 0.5f, 0.5f, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

CGRect frame = [[UIScreen mainScreen] bounds];

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, frame.size.width, frame.size.height);
glFrustumf(0, backingWidth, 0, backingHeight, -.1, -1000);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

float mat2[16];

mat2[0] = .268496;
mat2[1] = .082372;
mat2[2] = .127658;
mat2[3] = 0;
mat2[4] = .051842;
mat2[5] = .193987;
mat2[6] = -.234207;
mat2[7] = 0;
mat2[8] = -.142808;
mat2[9] = .225290;
mat2[10] = .154991;
mat2[11] = 0;
mat2[12] = .034580;
mat2[13] = -.001087;
mat2[14] = -.013952;
mat2[15] = 1;

glMultMatrixf(mat2);

glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);

for (float i = 0; i <= 6; i += 2) {
    for (float j = 0; j <= 6; j+= 2) {
        glPushMatrix();
        glColor4f(i/6, j/6, 0, 1);
        glTranslatef(i-3, j-3, 0);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
        glPopMatrix();
    }
}

glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

наконец, в файле EAGLView.m замените следующую строку в методе initWithCoder

renderer = [[ES2Renderer alloc] init];

с:

renderer = [[ES1Renderer alloc] init];

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

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Это странно:

glFrustumf(0, backingWidth, 0, backingHeight, -.1, -1000);

Последние два значения - это значения для ближней и дальней плоскостей.Это оба отрицательные значения.Из того, что я вижу, вы работаете только при z = 0, который находится вне этого диапазона.Странно, что вы видите что-либо.

Что если вы измените это на:

glFrustumf(0, backingWidth, 0, backingHeight, 1000, -1000);

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

glFrustumf(-10, 10, -10, 10, 1000, -1000);

??

0 голосов
/ 09 ноября 2010

Я нашел способ исправить это, который работает для меня, но я все еще хотел бы знать, что я делаю неправильно с моим вызовом glFrustrumf. Если я использую glOrthof, он работает просто отлично и устраняет проблему плоскости отсечения, которая у меня была. Кто-нибудь знает, что я делал не так с glFrustrumf?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...