2012-04-05 64 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