2012-11-13 27 views
1

我的问题是,我的透视投影做了相反的事情。相反,“缩水”我的对象到遥远的它正在扩大它:透视转换正在做相反

白色的部分是最接近的三角形。我想你明白。

我创建自己的透视投影,我发送给我的vertexshader。我使用的OpenGL如下状态:

gl.glEnable(GL2ES2.GL_DEPTH_TEST); 
gl.glDepthFunc(GL2ES2.GL_LEQUAL); 

gl.glEnable(GL2ES2.GL_CULL_FACE); 
gl.glCullFace(GL2ES2.GL_BACK); 
gl.glFrontFace(GL2ES2.GL_CW); 

我使用了perspectiveMatrix部分follwoing代码:

eye = {0,0,5}; 
viewMatrix = Calc.translate(identity_matrix, -eye[0], -eye[1], -eye[2]); 
perspectiveMatrix = Calc.buildPerspProjMat(90, 1, 0.5f, 10); 
model_view_projection = Calc.multiply(perspectiveMatrix, viewMatrix); 

凡Calc.java具有以下功能:

public static float[] translate(float[] m,float x,float y,float z){ 
    float[] t = { 1.0f, 0.0f, 0.0f, x, 
        0.0f, 1.0f, 0.0f, y, 
        0.0f, 0.0f, 1.0f, z, 
        0, 0, 0, 1.0f };  
    return multiply(t, m); 
} 

public static float[] buildPerspProjMat(float fov, float aspect, float znear, float zfar) { 
    float[] m = new float[16]; 
    float ymax = (float) (znear * Math.tan(Math.toRadians(fov/2))); 
    float ymin = -ymax; 
    float xmax = ymax * aspect; 
    float xmin = ymin * aspect; 

    float width = xmax - xmin; 
    float height = ymax - ymin; 

    float depth = zfar - znear; 
    float q = -(zfar + znear)/depth; 
    float qn = -2 * (zfar * znear)/depth; 

    float w = 2 * znear/width; 
    w = w/aspect; 
    float h = 2 * znear/height; 

    m[0] = w; 
    m[1] = 0; 
    m[2] = 0; 
    m[3] = 0; 

    m[4] = 0; 
    m[5] = h; 
    m[6] = 0; 
    m[7] = 0; 

    m[8] = 0; 
    m[9] = 0; 
    m[10] = q; 
    m[11] = qn; 

    m[12] = 0; 
    m[13] = 0; 
    m[14] = -1; 
    m[15] = 0; 
    return m; 
} 

回答

3

我不知道你是否直接上传到OpenGL,但是你的矩阵看起来像是在OpenGL中矩阵的典型外观。

的非转置矩阵被布置是这样的:

0 4 8 12 
1 5 9 13 
2 6 10 14 
3 7 11 15 

所以-​​1术语应当是M [11],等等

+0

感谢。我真的不明白你为什么要按照这个顺序排列它们,但它是有效的!我不得不改变我的翻译和乘法功能。 – Vejto

+0

是的,OpenGL使用列主要排序,你可能习惯于主要行。我以前曾经不止一次地咬过我。 – MikeMx7f