2012-04-05 86 views
0

我寫了下面的代碼,在x軸上旋轉一個整體,然後是y軸,並來回旋轉。該代碼生成期望的結果。一個革命的OpenGL矩陣變換

- (void)update 
{ 
if (_x_axis) { 
    if (i >= 6.28) { 
     i = 0; 
     _x_axis = false; 
    } else { 
     float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height); 
     GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); 
     self.effect.transform.projectionMatrix = projectionMatrix; 
     GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -3.0f); 
     modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, i, 0.0f, 1.0f, 0.0f); 
     self.effect.transform.modelviewMatrix = modelViewMatrix; 
     i += .01; 
    } 
} else { 
    if (i >= 6.28) { 
     i = 0; 
     _x_axis = true; 
    } else { 
     float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height); 
     GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); 
     self.effect.transform.projectionMatrix = projectionMatrix; 
     GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -3.0f); 
     modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, i, 1.0f, 0.0f, 0.0f); 
     self.effect.transform.modelviewMatrix = modelViewMatrix; 
     i += .01; 
    } 
} 

我的問題是,當我改變了增量我爲0.02%或0.2或.3這樣的東西,爲什麼立方體旋轉靜態只有一個革命?

如果將i遞增.2,則在重置和旋轉軸被更改之前,用於轉換的i的最後一個值爲6.2。基本上,保持立方體水平的是什麼?我認爲用更大的i增量,立方體在切換軸之前不會進行整個旋轉。

回答

1

6.28 = 2*M_PI,代碼給出了完整的旋轉。參數i直接給出GLKMatrix4Rotate。如果你想要不同的長度,你可以在條件中改變這個常量,或者在調用GLKMatrix4Rotate之前映射參數i

對於第二種方法中,修改代碼:

  1. 變化i[0;1]的間隔,使階梯寬度小一點。
  2. 致電GLKMatrix4Rotatei*2*M_PI

但是,現在的動畫通常會像以前一樣運行,但可以用easing functions來扭轉。

+0

我明白了。所以,基本上,爲什麼模型重置,而不是保持與它改變旋轉軸時相同的狀態? – 2012-04-07 00:49:04

+0

因爲在每次「更新」調用期間,您總會重置模型矩陣。當旋轉軸改變時,您可以在初始位置再次繪製模型一次。順便說一下'_rotation'的含義是什麼?似乎未被使用。 – 2012-04-07 07:49:07

+0

'_rotation'實際上應該是'i'。我會將模型重置爲之前的狀態以獲得所需的結果。有關這樣做的任何建議?有最佳做法嗎?我應該在更新結束時保存矩陣並將其設置爲更新開始? – 2012-04-07 13:54:49