我想創建自己的四元數類,得到奇怪的結果。我試圖旋轉的立方體像瘋了一樣閃爍,或者它正在變形。四元數變形或閃爍
這是我的代碼:
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
然後你的代碼在某處出錯了。你可以簡化你的測試用例並單元測試每個四元數方法嗎?嘗試手動傳遞簡單的案例,並驗證邊緣案例的正確性。不幸的是,除了有條不紊的和合理的編碼外,這裏沒有銀彈,大多數情況下都是前面提到的TDD。 –
是的,我的代碼不正確。我不是100%確定我理解你的答案,我的英文不是最好的......我儘量保持它儘可能基本,只渲染一個簡單的多維數據集。我不知道如何設置一個更簡單的測試用例,那麼,對不起。這是我正在使用的關於四元數的所有代碼。感謝您的迴應! – Edvin
簡單的代碼不會渲染任何東西,只需計算並輸出一個非常簡單的數據就可以驗證自己;你也可以嘗試用矩陣和四元數(或者更好的是,你信任的其他四元數函數庫)建立等價變換,然後檢查結果是否相同。希望能夠清楚一點。 –