2012-06-28 135 views
0

我在圍繞OpenGL的X軸旋轉時遇到了一些問題。我擁有的是在着色器內渲染的基本立方體,用於光照計算的法線。立方體的變換是投影矩陣乘以模型矩陣。這個級聯在着色器內完成,而旋轉和平移計算是在我寫的Matrix類內部完成的。當任何旋轉圍繞y軸進行,一切都旋轉如預期所示,通過這些圖片:OpenGL旋轉歪斜的問題

Render Result Render Result

的問題時,任何旋轉,如下所示繞X軸發生開始:

Render Result Render Result

顯然,x軸旋轉偏斜場景,並導致所有內容被示出不成比例。下面是代碼的計算的矩陣和傳遞是到着色器每此呈現時間:

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 

viewMatrix.setIdentity(); 
viewMatrix.translate(new Vector4(translation)); 
viewMatrix.rotate(1, 0, 0, -rotateX); 
viewMatrix.rotate(0, 1, 0, rotateY); 
Matrix4 mvMatrix = new Matrix4(viewMatrix); 

Matrix4 pMatrix = new Matrix4(projectionMatrix); 

lightShader.useShader();   
lightShader.setUniformVector("vColor", new Vector4(.4f,0,0,1f)); 
lightShader.setUniformMatrix("mvMatrix", mvMatrix); 
lightShader.setUniformMatrix("pMatrix", pMatrix); 
triangleBatch.draw(lightShader.getAttributes()); 

Display.update(); 

着色器代碼如下:

uniform mat4 mvMatrix; 
uniform mat4 pMatrix; 
uniform vec4 vColor; 
varying vec4 outFragColor; 
attribute vec4 inVertex; 
attribute vec4 inNormal; 
void main(void) { 
    vec3 newNorm = vec3(inNormal); 
    mat3 mNormalMatrix; 
    mNormalMatrix[0] = mvMatrix[0].xyz; 
    mNormalMatrix[1] = mvMatrix[1].xyz; 
    mNormalMatrix[2] = mvMatrix[2].xyz; 
    vec3 vNorm = normalize(mNormalMatrix * newNorm); 
    vec3 vLightDir = vec3(0.0, 0.0, 1.0); 
    float fDot = max(0.0, dot(vNorm, vLightDir)); 
    outFragColor.rgb = vColor.rgb * fDot; 
    outFragColor.a = vColor.a; 
    mat4 mvpMatrix; 
    mvpMatrix = pMatrix * mvMatrix; 
    gl_Position = mvpMatrix * inVertex; 
} 

最後,對於旋轉的矩陣數學代碼是作爲如下:

public Matrix4 rotate(Vector4 a, float radians){ 
    Matrix4 temp = new Matrix4().setToRotate(a, radians); 
    this.multiply(temp); 
    return this; 
} 

public Matrix4 setToRotate(Vector4 a, float radians){ 
    a = new Vector4(a).normalise(); 
    float c = GameMath.cos(radians); 
    float s = GameMath.sin(radians); 
    float t = 1-c; 
    float x = a.x; 
    float y = a.y; 
    float z = a.z; 
    float x2 = a.x*a.x; 
    float y2 = a.y*a.y; 
    float z2 = a.z*a.z; 
    this.setIdentity(); 
    this.matrix[0] = c + t*x2; 
    this.matrix[1] = t*x*y + s*z; 
    this.matrix[2] = t*x*z - s*y; 
    this.matrix[4] = t*x*y - s*z; 
    this.matrix[5] = c + t*y2; 
    this.matrix[6] = t*y*z + s*x; 
    this.matrix[8] = t*x*z + s*y; 
    this.matrix[9] = t*y*z + s*x; 
    this.matrix[10] = c + t*z2; 
    return this; 
} 

矩陣存儲在列主要。

+1

投影矩陣的參數是什麼? – Tim

+0

近平面:1,遠平面:100,視野:45,長寬比:640/480 – dagronlund

+1

您是否確定這不是方面的整數除法?這是一個常見的錯誤。 – Tim

回答

0

我發現問題是什麼。顯然,setToRotate()中的一個操作需要從加法變爲減法。它現在按預期工作。