0

立方体があるとします。座標値がこのようになっているとします。(アーム1台分)

GLfloat vertA[3] = { 0.5, 0.5, 0.5};
GLfloat vertB[3] = {-0.5, 0.5, 0.5};
GLfloat vertC[3] = {-0.5,-0.5, 0.5};
GLfloat vertD[3] = { 0.5,-0.5, 0.5};
GLfloat vertE[3] = { 0.5, 0.5,-0.5};
GLfloat vertF[3] = {-0.5, 0.5,-0.5};
GLfloat vertG[3] = {-0.5,-0.5,-0.5};
GLfloat vertH[3] = { 0.5,-0.5,-0.5};

のように訳すと

glTranslatef(1,2,3);

次に、1、2、3 がそれぞれ x、y、z 座標に追加されます。これらは、変換された立方体の新しい座標値です。しかし、ある程度回転させると(翻訳の有無にかかわらず)

glRotatef(25,0,0,1);

回転した立方体の現在の座標は? 私はopenglで新しく取り組んでいます。Windowsでc++を使用しています。

4

2 に答える 2

2

線形代数と変換行列に慣れておく必要があります。

glRotate行うことは、回転行列を生成し、それ現在の行列に後置乗算することです。ここで注意すべき点がいくつかあります。glTranslateは頂点座標に直接何も追加せず、glRotateも座標を変更しません。これらが行うことはすべて、単一のマトリックスを変更することです。このマトリックスは、すべての変換の構成を蓄積し、描画呼び出し中にすべての頂点に1 回適用されます。

あなたの場合、z 軸を中心に 25 度の回転が必要なため、z 座標は変更されません。回転行列は次のようになります

|  cos(25°)   -sin(25°)    0        0   |
|  sin(25°)    cos(25°)    0        0   |
|     0           0        1        0   |
|     0           0        0        1   |

この行列をベクトル (x,y,z,w)^T に適用するには、行列にベクトルを掛けるだけです。その乗算のルールに従って、次の新しいベクトルを取得します

x' = cos(25°)*x -sin(25°)*y y' = sin(25°)*x +cos(25°)*y z' = z w' = w

これは、平行移動を考慮せずに、回転だけです。ただし、zour 頂点の値を int にすると、変換された結果が返されます。

于 2014-05-25T14:19:02.427 に答える
0

ここでは、現在のマトリックスを z 軸で 25 度回転させています。これは、同じことを行う glm::rotate のコードです。

template <typename T, precision P>
GLM_FUNC_QUALIFIER detail::tmat4x4<T, P> rotate
(
    detail::tmat4x4<T, P> const & m,
    T const & angle,
    detail::tvec3<T, P> const & v
)
{
    T c = cos(a);
    T s = sin(a);

    detail::tvec3<T, P> axis(normalize(v));
    detail::tvec3<T, P> temp((T(1) - c) * axis);

    detail::tmat4x4<T, P> Rotate(detail::tmat4x4<T, P>::_null);
    Rotate[0][0] = c + temp[0] * axis[0];
    Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];
    Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];

    Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];
    Rotate[1][1] = c + temp[1] * axis[1];
    Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];

    Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];
    Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
    Rotate[2][2] = c + temp[2] * axis[2];

    detail::tmat4x4<T, P> Result(detail::tmat4x4<T, P>::_null);
    Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];
    Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];
    Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];
    Result[3] = m[3];
    return Result;
}
于 2014-05-25T14:13:53.047 に答える