Ios OpenGL矩阵变换的一场革命

Ios OpenGL矩阵变换的一场革命,ios,opengl-es,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);

我编写了下面的代码,在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增加0.2,则在重置和更改旋转轴之前,变换中使用的最后一个i值将为6.2。基本上,什么是保持立方体级别?我认为,随着I的增大,立方体在切换轴之前不会旋转一整圈。

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

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

  • i
    的间隔更改为
    [0;1]
    ,并使步长稍小一些
  • 使用
    i*2*M_PI
    调用
    GLKMatrix4Rotate

  • 现在动画通常和之前一样运行,但是,您可以使用

    我明白了。那么,基本上,为什么模型在更改旋转轴时会重置,而不是保持在相同的状态?因为在每次
    更新
    调用期间总是重置模型矩阵。更改旋转轴后,可以在初始位置再次绘制模型。顺便问一下,
    旋转的含义是什么?似乎没有使用。
    \u-rotation
    实际上应该是
    i
    。我会将模型重置为以前的状态,以获得所需的结果。有什么建议吗?是否有最佳实践?我应该在更新结束时保存矩阵并将其设置为更新开始吗?我无法给出最佳实践。我会用其他参数(比如我)重新计算矩阵,就像你做的那样。否则,从长远来看,错误可能会成倍增加。