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

「各回転は、軸の 1 つを中心に 90*n 度だけにする必要があります」

この場合の回転行列はほとんど自明であり、ゼロ、1、およびマイナス 1 のみで構成されます。

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 |

Ox の周りの回転:

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

オイ周りの回転:

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

これらの行列によるベクトルの乗算を展開すると、最小の丸め誤差で必要な回転が得られます。

絶対精度が必要な場合は、元の (x,y,z) ベクトルを格納し、各回転トリプル (ax、y、az) について (1 と 0 の) R 行列を計算するか、これらの行列が偶数順列を表すことを覚えておいてください。スワップのみで(x、y、z)を回転できるようにします。

もう一つ。立方体の側面から側面へのスムーズな回転を考えている場合は、SLerp を探して、アニメーション タイマーを使用して Src から Dest への回転を補間する必要があります。

于 2012-05-27T06:01:14.527 に答える