1

我使用 OpenGL 创建了一个立方体,但目前它可以自由旋转,所以它可以向任何方向旋转。

我如何对其进行编码,使其仅向上、向下、向左和向右旋转?

这是我的旋转代码:

    + (void)applyRotation:(GLfloat *)m x:(GLfloat)x y:(GLfloat)y z:(GLfloat)z {
    GLfloat tempMatrix[16];

    if(x != 0) {
    GLfloat c = cosf(x);
    GLfloat s = sinf(x);

    [self applyIdentity:tempMatrix];

    tempMatrix[5] = c;
    tempMatrix[6] = -s;
    tempMatrix[9] = s;
    tempMatrix[10] = c;

    [self multiplyMatrix:tempMatrix by:m giving:m];
    }

    if(y != 0) {
    GLfloat c = cosf(y);
    GLfloat s = sinf(y);

    [self applyIdentity:tempMatrix];

    tempMatrix[0] = c;
    tempMatrix[2] = s;
    tempMatrix[8] = -s;
    tempMatrix[10] = c;

    [self multiplyMatrix:tempMatrix by:m giving:m];
    }

    if(z != 0) {
    GLfloat c = cosf(z);
    GLfloat s = sinf(z);

    [self applyIdentity:tempMatrix];

    tempMatrix[0] = c;
    tempMatrix[1] = -s;
    tempMatrix[4] = s;
    tempMatrix[5] = c;

    [self multiplyMatrix:tempMatrix by:m giving:m];
    }
    }
4

1 回答 1

0

“每次旋转只能围绕其中一个轴旋转 90*n 度”

在这种情况下,旋转矩阵几乎是微不足道的,仅由零、一和负一组成。

sin(90 * n) = 0, 1, 0, -1, 0, 1, 0, -1, ...
cos(90 * n) = 1, 0, -1, 0, 1, 0, -1, 0, ...

绕 Oz 旋转(我们假设 a = 90 * n):

| cos(a)  -sin(a)   0 |
| sin(a)   cos(a)   0 | 
|  0        0       1 |

围绕牛旋转:

|   1      0      0    |
|   0    cos(a) sin(a)  |
|   0   -sin(a) cos(a)  |

绕 Oy 旋转:

|  cos(a)   0   sin(a)  |
|   0       1     0    |
|  -sin(a)  0   cos(a)  |

展开向量乘以这些矩阵,您将获得所需的旋转,且舍入误差最小。

如果您想要绝对精度,请存储原始 (x,y,z) 向量并为每个旋转三元组 (ax, ay, az) 计算 R 矩阵(由 1 和 0 组成),或者只记住这些矩阵表示偶数排列的基本向量,因此您可以仅使用交换来旋转 (x,y,z)。

还有一件事。如果您正在考虑从立方体的一侧到另一侧的平滑旋转,那么您必须寻找 SLerp 并使用一些动画计时器插入 Src-to-Dest 旋转。

于 2012-05-27T06:01:14.527 回答