OpenGL矩阵转换为一场革命

时间:2012-04-05 00:22:30

标签: ios opengl-es

我编写了以下代码,在x轴上旋转一个立方体,然后是y轴,前后旋转。代码生成所需的结果。

- (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;
    }
}

我的问题是,当我将i的增量更改为诸如.02或.2或.3之类的东西时,为什么立方体仍然只旋转一圈呢?

如果i增加.2,则转换中使用的i的最后一个值将为6.2,然后才会重置并更改旋转轴。基本上,什么是保持立方体水平?我认为,对于i的较大增量,立方体在切换轴之前不会进行整个旋转。

1 个答案:

答案 0 :(得分:1)

6.28 = 2*M_PI,代码完全轮换。参数i直接提供给GLKMatrix4Rotate。如果您需要不同的长度,可以在条件中改变此常量,或在调用i之前映射参数GLKMatrix4Rotate

对于第二种方法,修改代码:

  1. i的间隔更改为[0;1],并使步长稍微缩小。
  2. 使用GLKMatrix4Rotate致电i*2*M_PI
  3. 现在,animtion通常像以前一样运行,但是,你可以用easing functions来扭转它。