2012-09-27 149 views
0

[解决 - 参见答案在底部]OpenGL ES 2.0的透视投影 - >立方体是矩形

我试图绘制一个立方体的角度来看,在iOS(iPhone)使用OpenGL ES 2.0的,但它呈现为矩形形状。

从我搜集的网络看来,它似乎与视口/投影矩阵有关,但我似乎无法将手指放在实际的原因上。

如果我将视口设置为方形度量(宽度==高度),它将非常好地绘制(一个立方体),但是如果我正确设置了它(width = screen_width,height = screen_height),那么该立方体被绘制为矩形形状。

应该使用视口相应地设置投影矩阵使立方体保持立方体?!

我的代码(请让我知道,如果需要更多的信息):

Render方法:

// viewportSize is SCREEN_WIDTH and SCREEN_HEIGHT 
// viewportLowerLeft is 0.0 and 0.0 
ivec2 size = this->viewportSize; 
ivec2 lowerLeft = this->viewportLowerLeft; 
glViewport(lowerLeft.x, lowerLeft.y, size.x, size.y); // if I put size.x, size.x it draws well 


mat4 projectionMatrix = mat4::FOVFrustum(45.0, 0.1, 100.0, size.x/size.y); 

glUniformMatrix4fv(uniforms.Projection, 1, 0, projectionMatrix.Pointer()); 

矩阵运算:

static Matrix4<T> Frustum(T left, T right, T bottom, T top, T near, T far) 
{ 
    T a = 2 * near/(right - left); 
    T b = 2 * near/(top - bottom); 
    T c = (right + left)/(right - left); 
    T d = (top + bottom)/(top - bottom); 
    T e = - (far + near)/(far - near); 
    T f = -2 * far * near/(far - near); 
    Matrix4 m; 
    m.x.x = a; m.x.y = 0; m.x.z = 0; m.x.w = 0; 
    m.y.x = 0; m.y.y = b; m.y.z = 0; m.y.w = 0; 
    m.z.x = c; m.z.y = d; m.z.z = e; m.z.w = -1; 
    m.w.x = 0; m.w.y = 0; m.w.z = f; m.w.w = 1; 
    return m; 
} 
static Matrix4<T> FOVFrustum(T fieldOfView, T near, T far, T aspectRatio) 
{ 
    T size = near * tanf(DEGREES_TO_RADIANS(fieldOfView)/2.0); 
    return Frustum(-size, size, -size/aspectRatio, size/aspectRatio, near, far); 
} 
+0

FOVFrustum构造函数最后一个参数的比例是什么意思?似乎你的问题可能在那里。 – jakev

+0

@jakev:我不追随,没有它,我该如何计算FOV Frustum?你能详细说明一下吗? – lm2s

+0

矩阵乘法的顺序或类似的事情是这个原因吗? – lm2s

回答

0

好的我发现问题了,size.x和size.y是int,所以除法返回一个INT。

1.0 * size.x/size.y 

解决问题。 facepalm

0

如果您避风港” t已经知道了这一点,改变:

return Frustum(-size, size, -size/aspectRatio, size/aspectRatio, near, far); 

return Frustum(-size/aspectRatio, size/aspectRatio, -size, size,, near, far); 

,它应该正确绘制。 (或者简单的把size.x/size.y改成size.y/size.x)

+0

切换.x和.y是我所做的第一件事情之一,它只是使多维数据集甚至不出现在屏幕上。我尝试按照您的建议切换Frustum函数参数,并导致相同的结果。 – lm2s

+0

尝试将glUniformMatrix4fv的第三个参数设置为true – jonathan

+0

第三个参数为True时,立方体不再显示(并且我在所有坐标轴中都有一个循环移动)。问题似乎在其他地方,但我真的不知道在哪里看。 – lm2s