2010-11-08 63 views
1

我正試圖在我正在寫的一個自定義ipad應用程序中查看一些3d幾何圖形。我遇到的問題是,當我縮放,平移和旋轉我的模型時,邊緣會被剪切,而我不知道爲什麼。我認爲這不是因爲近/遠裁剪平面,因爲我改變了這些,沒有發生任何事情,它仍然會剪輯。另外,它只在一個方向上進行。另一個方向呈現得很好。有任何想法嗎?轉換矩陣是使用我創建的arcball操作類創建的,但由於顯而易見的原因,我只包含硬編碼的視圖矩陣。硬編碼矩陣顯示問題很好。場景中只有一堆正方形被渲染,在兩個角落被剪切。爲什麼我的opengl 1.1視口剪輯我的幾何?

要重複我的問題,創建用於iPad的新的OpenGL ES的項目,然後將以下代碼粘貼在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); 

現在更換整個渲染方法具有以下:

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]; 

和運行。您會看到以一定角度旋轉的方格網格,並且剪切了左上角和右下角的邊緣。這是我無法弄清楚如何擺脫。任何幫助表示讚賞。謝謝。

回答

1

這就奇怪了:

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

最後兩個數值爲近及遠平面的值。這些都是負值。從我所看到的情況來看,你只在z = 0時工作,而這個範圍在這個範圍之外。你看到任何東西都很奇怪。

如果你改變這是什麼:

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

?前四個值也對應於左側,右側,頂部和底部。這些都是正值,而你的正方形可能有負值。如果你讓他們更加平衡作爲

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

0

我想出了一種方法來解決這個問題,但我仍然想知道我在做什麼,我的glFrustrumf調用錯了。如果我使用glOrthof,它可以正常工作,並修復我遇到的裁剪面問題。任何人都知道我在做glFrustrumf錯了什麼?

相關問題