我正在尝试在我正在编写的自定义ipad应用程序中查看某些3d几何体。我遇到的问题是当我缩放,平移和旋转我的模型时,边缘会被修剪,我不知道为什么。我不认为这是因为近/远剪裁平面,因为我改变它们并且没有任何反应,它仍然是剪辑。而且,它只在一个方向上完成。另一个方向渲染得很好。有任何想法吗?转换矩阵是使用我创建的arcball操作类创建的,但出于显而易见的原因,我只包含了一个硬编码的视图矩阵。硬编码矩阵显示问题就好了。场景中只有一堆正方形被渲染,可以夹在两个角上。
要复制我的问题,请为iPad创建一个新的opengl项目,然后在“return self;”之前将以下代码粘贴到ES1Renderer.m init方法的末尾:
glMatrixMode(GL_PROJECTION);
CGRect frame = [[UIScreen mainScreen] bounds];
glViewport(0, 0, frame.size.width, frame.size.height);
glFrustumf(-1000, 1000, -1000, 1000, 10000, 10000);
现在用以下内容替换整个render方法:
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];
然后跑。您将看到以一定角度旋转的正方形网格,并且左上边缘和右下边缘被剪裁。这是我无法弄清楚如何摆脱。任何帮助表示赞赏。感谢。
答案 0 :(得分:1)
这很奇怪:
glFrustumf(0, backingWidth, 0, backingHeight, -.1, -1000);
最后两个值是近平面和远平面的值。这些都是负值。从我所看到的,你只在z = 0处工作,它位于这个范围之外。你看到任何东西都很奇怪。
如果您将其更改为:
,该怎么办?glFrustumf(0, backingWidth, 0, backingHeight, 1000, -1000);
?前四个值对应左,右,上和下。这些都是正值,而您的方块可能具有负值。如果你在
中使它们更平衡怎么办?glFrustumf(-10, 10, -10, 10, 1000, -1000);
...
答案 1 :(得分:0)
我想出了一种方法来解决它对我有用,但我仍然想知道我的glFrustrumf调用我做错了什么。如果我使用glOrthof,它工作得很好,并修复了我遇到的剪裁平面问题。任何人都知道glFrustrumf我做错了什么?