2013-09-16 35 views
2

我想創建自己的四元數類,得到奇怪的結果。我試圖旋轉的立方體像瘋了一樣閃爍,或者它正在變形。四元數變形或閃爍

這是我的代碼:

void Quaternion::AddRotation(vec4 v) 
{ 
    Quaternion temp(v.x, v.y, v.z, v.w); 
    *this = temp * (*this); 
} 

mat4 Quaternion::GenerateMatrix(Quaternion &q) 
{ 
    q.Normalize(); 

    //Row order 
    mat4 m(1 - 2*q.y*q.y - 2*q.z*q.z, 2*q.x*q.y - 2*q.w*q.z, 2*q.x*q.z + 2*q.w*q.y, 0, 
      2*q.x*q.y + 2*q.w*q.z, 1 - 2*q.x*q.x - 2*q.z*q.z, 2*q.y*q.z + 2*q.w*q.x, 0, 
      2*q.x*q.z - 2*q.w*q.y, 2*q.y*q.z - 2*q.w*q.x, 1 - 2*q.x*q.x - 2*q.y*q.y, 0, 
      0, 0, 0, 1); 

    //Col order 
    // mat4 m(1 - 2*q.y*q.y - 2*q.z*q.z,2*q.x*q.y + 2*q.w*q.z,2*q.x*q.z - 2*q.w*q.y,0, 
    //   2*q.x*q.y - 2*q.w*q.z,1 - 2*q.x*q.x - 2*q.z*q.z,2*q.y*q.z - 2*q.w*q.x,0, 
    //   2*q.x*q.z + 2*q.w*q.y,2*q.y*q.z + 2*q.w*q.x,1 - 2*q.x*q.x - 2*q.y*q.y,0, 
    //   0,0,0,1); 

    return m; 
} 

當我創建實體我給它一個四元數:

entity->Quat.AddRotation(vec4(1.0f, 1.0f, 0.0f, 45.f)); 

每幀我試圖通過少量額外旋轉它:

for (int i = 0; i < Entities.size(); i++) 
{ 
    if (Entities[i] != NULL) 
    { 
     Entities[i]->Quat.AddRotation(vec4(0.5f, 0.2f, 1.0f, 0.000005f)); 
     Entities[i]->DrawModel(); 
    } 
    else 
     break; 
} 

最後這是我如何繪製每個立方體:

void Entity::DrawModel() 
{ 
    glPushMatrix(); 

    //Rotation 
    mat4 RotationMatrix; 
    RotationMatrix = this->Quat.GenerateMatrix(this->Quat); 

    //Position 
    mat4 TranslationMatrix = glm::translate(mat4(1.0f), this->Pos); 

    this->Trans = TranslationMatrix * RotationMatrix; 

    glMultMatrixf(value_ptr(this->Trans)); 

    if (this->shape != NULL) 
     this->shape->DrawShape(); 

    glPopMatrix(); 
} 

編輯:這是我用來學習四元教程: http://www.cprogramming.com/tutorial/3d/quaternions.html

+0

然後你的代碼在某處出錯了。你可以簡化你的測試用例並單元測試每個四元數方法嗎?嘗試手動傳遞簡單的案例,並驗證邊緣案例的正確性。不幸的是,除了有條不紊的和合理的編碼外,這裏沒有銀彈,大多數情況下都是前面提到的TDD。 –

+0

是的,我的代碼不正確。我不是100%確定我理解你的答案,我的英文不是最好的......我儘量保持它儘可能基本,只渲染一個簡單的多維數據集。我不知道如何設置一個更簡單的測試用例,那麼,對不起。這是我正在使用的關於四元數的所有代碼。感謝您的迴應! – Edvin

+0

簡單的代碼不會渲染任何東西,只需計算並輸出一個非常簡單的數據就可以驗證自己;你也可以嘗試用矩陣和四元數(或者更好的是,你信任的其他四元數函數庫)建立等價變換,然後檢查結果是否相同。希望能夠清楚一點。 –

回答

0

沒有你的旋轉矩陣學習到最後,還有我能想到的兩種可能的錯誤。第一個是你的旋轉矩陣R不是正交的,即R的倒數不等於轉置。這可能會導致物體翹曲。第二個隱藏bug的地方在於你的四元數乘法。

+0

我查過了。逆!=轉置。感謝提醒我,我會調查此事並希望找到解決方案! – Edvin

0

旋轉矩陣存在錯誤。嘗試用元素(3,2)交換元素(2,3)。

+0

這解決了我的閃爍問題!謝謝!但是現在我遇到了另一個問題......對象只圍繞自己的Y軸旋轉。我會更深入地研究這個問題。至少這是更容易調試,然後閃爍... – Edvin