2013-10-05 38 views
0

基本上,我需要在按左鍵(將視圖向右轉)時正確地改變眼圖和向上矢量。我的實現如下,但它似乎沒有通過測試。任何人都可以幫忙實現在openGL中左轉功能

// 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; 
} 

旋轉函數有兩個參數度和軸線,並返回旋轉矩陣是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; 
} 
+0

您沒有提供足夠的信息,哪些測試失敗?他們如何失敗?某些測試值的實際和預期輸出是多少?你確定'Transform :: rotate'返回正確的旋轉矩陣嗎? – user2802841

+0

我在這裏附加了'Transform :: rotate'的完整實現。 –

回答

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); 
} 
+0

這不起作用。而不是平穩地旋轉,這變成了「跳躍」。 –

+0

@YichengYe我在我的程序中測試了它,它似乎正確旋轉我的相機。它究竟是如何工作的(除了「跳躍」可能有完全不同的原因)?它是否在錯誤的方向旋轉? – user2802841

+0

它的旋轉方向正確,但旋轉不平滑,如每旋轉180度旋轉一次。 –

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 = eye * rotate(degrees, up); 
} 

旋轉功能正確。