Я пытаюсь просмотреть некоторую трехмерную геометрию в пользовательском приложении для 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];
и беги. Вы увидите, что сетка квадратов повернута на угол, а верхний левый и нижний правый края обрезаны. Это то, что я не могу понять, как избавиться от. Любая помощь приветствуется. Спасибо.