[解决 - 参见答案在底部]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);
}
FOVFrustum构造函数最后一个参数的比例是什么意思?似乎你的问题可能在那里。 – jakev
@jakev:我不追随,没有它,我该如何计算FOV Frustum?你能详细说明一下吗? – lm2s
矩阵乘法的顺序或类似的事情是这个原因吗? – lm2s