0

基本的に、左キーを押す (ビューを右に回す) ときに、目とアップ ベクトルを正しく変更する必要があります。私の実装は次のとおりですが、テストに合格していないようです。誰でも助けることができますか?

// Transforms the camera left around the "crystal ball" interface
void Transform::left(float degrees, vec3& eye, vec3& up) {
    // YOUR CODE FOR HW1 HERE
    eye = rotate(degrees, vec3(0, 1, 0)) * eye;
    up = rotate(degrees, vec3(0, 1, 0)) * up;
}

回転関数は、度と軸の 2 つの引数を取り、3 行 3 列の行列である回転行列を返します。

mat3 Transform::rotate(const float degrees, const vec3& axis) {
    // YOUR CODE FOR HW1 HERE

    mat3 rot, I(1.0);
    mat3 a_x;
    a_x[0][0] = 0;
    a_x[0][1] = -axis[2];
    a_x[0][2] = axis[1];
    a_x[1][0] = axis[2];
    a_x[1][1] = 0;
    a_x[1][2] = -axis[0];
    a_x[2][0] = -axis[1];
    a_x[2][1] = axis[0];
    a_x[2][2] = 0;
    float theta = degrees / 180 * pi;
    rot = I * cos(theta) + glm::outerProduct(axis, axis) *(1-cos(theta)) + a_x*sin(theta);
    return rot;
}  
4

2 に答える 2

0

次のような方法で修正されるかどうか試してください。

glm::mat3 Transform::rotate(float angle, const glm::vec3& axis) {
    glm::mat3 a_x(   0.0f,  axis.z, -axis.y,
                  -axis.z,    0.0f,  axis.x,
                   axis.y, -axis.x,    0.0f);
    angle = glm::radians(angle);
    return glm::mat3() * cos(angle) + sin(angle) * a_x
        + (1.0f - cos(angle)) * glm::outerProduct(axis, axis);
}
于 2013-10-05T11:04:31.410 に答える