1

私の数学は間違っていますか?ユーザーは度単位で角度を入力できるはずであり、それぞれ行列を回転させます。代わりに、オブジェクトを縮小して反転します...呼び出します

glmxRotate(&modelview, 0.0f, 0.0f, 1.0f, 90.0f);

(modelviewは単位行列です)は次のようになります。

通常: http: //i.imgur.com/eX7Td.png

回転:http ://i.imgur.com/YnMEn.png

これがglmxRotateです:

glmxvoid glmxRotate(glmxMatrix* matrix, glmxfloat x, glmxfloat y, glmxfloat z,
    glmxfloat angle)
{
    if(matrix -> mx_size != 4){GLMX_ERROR = GLMX_NOT_4X4; return;}

    //convert to rads
    angle *= 180.0f / 3.14159;

    const glmxfloat len = sqrtf((x * x) + (y * y) + (z * z)),
                    c = cosf(angle),
                    c1 = 1.0f - c,
                    s = sinf(angle);

    //normalize vector
    x /= len;
    y /= len;
    z /= len;

    glmxfloat rot_mx[] = {x * x * c1 + c,
                          x * y * c1 + z * s,
                          x * z * c1 - y * s,
                          0.0f,

                          x * y * c1 - z * s,
                          y * y * c1 + c,
                          y * z * c1 + x * s,
                          0.0f,

                          x * z * c1 + y * s,
                          y * z * c1 - x * s,
                          z * z * c1 + c,
                          0.0f,

                          0.0f,
                          0.0f,
                          0.0f,
                          1.0f,};

    _glmxMultiMatrixArray(matrix, rot_mx, 4);
}

また、変換行列が最後の4列の変換で定義されている場合、結果は常に0になるため、単位行列を変換するにはどうすればよいでしょうか。

4

2 に答える 2

1

あなたの行列は私には正しいように見えますが、ラドに対する角度の乗算が実際には角度の乗算に対するラジアンであることを知っていますか?

//convert to rads
angle *= 180.0f / 3.14159;

する必要がありますPi/180.f

于 2012-10-05T21:43:54.470 に答える
0

フロートがsinに格納されるスペースは限られており、cosは正確に計算されないため、これは、オブジェクトが回転するたびに小さなエラーが発生することを意味します。これは、時間の経過とともにオブジェクトが小さくなることを意味します。これを起こさないようにするには、ローテーションにクォータニオンを使用します。 https://www.npmjs.com/package/quaternion

于 2019-12-02T23:11:10.393 に答える