2013-09-30 74 views
0

所以我試圖在iPad上使用GLKit繪製和旋轉一個立方體。我的問題是,隨着立方體旋轉,看起來縱橫比隨着它的變化而變化,在旋轉時擠壓它。我的意思是在立方體逆時針旋轉90度後的三幅圖像中可以看到。雖然在開始時(第一張圖片),立方體的比例寬度/高度大約爲。 1/2我已經通過GLKit投影

GLKMatrix4 scaleMatrix=GLKMatrix4MakeScale(0.5, 1., 0.3); 

因爲它原來它被「擠」之後的pI/2圈結束時,與約爲該基材(前翻)的一側是雙倍的高度設定(第三張圖片)。我相信我的錯誤是在我傳遞給GLKMatrix4MakePerspective的論據中,但是因爲我不熟悉openGL方法的所有調用,並且我也放了一些我的代碼的一些部分,我相信這些部分可能與此有關,在圖片。

enter image description here enter image description here enter image description here

- (void)draw{ 
//just a quaternion that rotates the cube 
GLKQuaternion glkq=GLKQuaternionMake(_quat.x,_quat.y,_quat.z,_quat.w); 
GLKMatrix4 rotationMatrix=GLKMatrix4MakeWithQuaternion (glkq); 

GLKMatrix4 scaleMatrix=GLKMatrix4MakeScale(0.5, 1., 0.3); 
GLKMatrix4 translateMatrix = GLKMatrix4MakeTranslation(0.,0.,0.); 

GLKMatrix4 modelMatrix =GLKMatrix4Multiply(translateMatrix, 
          GLKMatrix4Multiply(scaleMatrix,rotationMatrix)); 

GLKMatrix4 viewMatrix = GLKMatrix4MakeLookAt(0, 0, 5, 0, 0, 0, 0, 1 , 0); 
effect.transform.modelviewMatrix = GLKMatrix4Multiply(viewMatrix, modelMatrix); 


effect.transform.projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(45.0f), 3./4., 3, -5); 

[effect prepareToDraw]; 

glEnable(GL_DEPTH_TEST); 
glEnable(GL_CULL_FACE); 

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, triangleVertices); 

glEnableVertexAttribArray(GLKVertexAttribColor); 
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, triangleColors); 

glDrawArrays(GL_TRIANGLES, 0, 36); 

glDisableVertexAttribArray(GLKVertexAttribPosition); 
glDisableVertexAttribArray(GLKVertexAttribColor); 
} 

我不知道,如果你也許需要的代碼的其他一些地方,告訴我什麼,我做錯了什麼......

回答

0

矩陣乘法一系列幾何變換從右向左工作,不可交換。即,給定的旋轉矩陣R和規模矩陣S,產品S x R指「R旋轉,然後通過S規模」,它是從一個不同的結果「由S刻度,然後通過R旋轉」(由產品所給出R x S)。

你在旋轉後縮放:不是將一個立方體壓縮到一個矩形棱鏡中然後旋轉它,而是旋轉一個立方體然後壓平生成的圖像。反轉你的乘積scaleMatrixrotationMatrix,你應該看到你期望的結果。

(另外,你translateMatrix指定的零翻譯,所以乘以它到模型視圖矩陣什麼都不做。如果是零,但是,你應該乘什麼樣的順序到你的模型視圖矩陣?)

+0

謝謝,rickster,是的,這正是我應該先縮放然後旋轉的問題。關於翻譯,我想它應該是最後的(在左邊)?否則不會圍繞對象的中心旋轉?我不知道我必須嘗試... – venkman