Jason L. McKesson'un online "Modern 3D Grafik Programlamayı Öğrenme" kitabını okuyorum
Şu an itibariyle, gimbal kilit problemine ve kuaterniyonlar kullanarak nasıl çözüleceğine bağlıyım.
Ancak burada, Kuaterniyonlar sayfasında .
Sorunun bir parçası, bir yönlendirmeyi 3 birikmiş eksenel rotasyon serisi olarak depolamaya çalışmamızdır. Yönelimler, döndürmeler değil, yönelimlerdir. Ve yönelimler kesinlikle bir dizi rotasyon değildir. Bu yüzden geminin yönünü belirli bir miktar olarak bir yönelim olarak ele almalıyız.
Sanırım bu kafam karışmaya başladığım ilk nokta, çünkü yönler ve rotasyonlar arasındaki dramatik farkı görmüyorum. Bir oryantasyonun neden bir dizi rotasyon ile temsil edilemediğini de anlamıyorum ...
Ayrıca:
Bu amaca yönelik ilk düşünce, yönelimi bir matris olarak tutmak olacaktır. Yönlendirmeyi değiştirme zamanı geldiğinde, sonucu yeni akım yönü olarak depolayarak bu matrise basitçe bir dönüşüm uygularız.
Bu, geçerli yönlendirmeye uygulanan her sapma, eğim ve yuvarlanmanın o geçerli yönlendirmeye göre olacağı anlamına gelir. Tam da ihtiyacımız olan şey bu. Kullanıcı pozitif bir sapma uygularsa, sapmanın bazı sabit koordinat sistemlerine göre değil, mevcut işaret ettikleri yere göre döndürmesini istersiniz.
Kavram, anlıyorum, ancak matris dönüşümleri biriktirmek bu soruna bir çözüm olup olmadığını nasıl anlayamıyorum , önceki sayfada verilen kod sadece bu değil.
İşte kod:
void display()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutil::MatrixStack currMatrix;
currMatrix.Translate(glm::vec3(0.0f, 0.0f, -200.0f));
currMatrix.RotateX(g_angles.fAngleX);
DrawGimbal(currMatrix, GIMBAL_X_AXIS, glm::vec4(0.4f, 0.4f, 1.0f, 1.0f));
currMatrix.RotateY(g_angles.fAngleY);
DrawGimbal(currMatrix, GIMBAL_Y_AXIS, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
currMatrix.RotateZ(g_angles.fAngleZ);
DrawGimbal(currMatrix, GIMBAL_Z_AXIS, glm::vec4(1.0f, 0.3f, 0.3f, 1.0f));
glUseProgram(theProgram);
currMatrix.Scale(3.0, 3.0, 3.0);
currMatrix.RotateX(-90);
//Set the base color for this object.
glUniform4f(baseColorUnif, 1.0, 1.0, 1.0, 1.0);
glUniformMatrix4fv(modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(currMatrix.Top()));
g_pObject->Render("tint");
glUseProgram(0);
glutSwapBuffers();
}
Anladığım kadarıyla, yaptığı şey değil (yığın üzerindeki bir matrisi değiştirmek) biriken matrisler olarak kabul edildi, çünkü yazar tüm bireysel dönüş dönüşümlerini yığının üstünde depolanan bir matrise birleştirdi.
Bir matris anlayışım, bir kökene (yani ... modele) göre bir nokta almak ve onu başka bir kökene (kamera) göre yapmak için kullanıldıklarıdır. Eminim ki bu güvenli bir tanımdır, ancak bu gimbal kilit problemini anlamamı engelleyen eksik bir şey var gibi hissediyorum.
Bana mantıklı gelmeyen bir şey var: Eğer bir matris iki "boşluk" arasındaki göreceli farkı belirlerse, Y ekseni etrafında bir dönüş gelelim, yani rulo, noktayı "boşluk" "Bu daha sonra bu ruloya göre bir kez daha dönüştürülebilir ... Başka bir deyişle, bu noktaya başka dönüşümler bu yeni" rulo boşluğu "ile ilişkili olmamalı ve bu nedenle rotasyonun bir öncekine göreli olmaması gerekir" model alanı "olan gimbal kilide neden oluyor.
Bu yüzden gimbal kilit doğru değil mi? Çünkü nesneyi kendi göreli eksenleri etrafında döndürmek yerine X, Y ve Z eksenleri etrafında döndürüyoruz . Yoksa yanılıyor muyum?
Görünüşe göre bağlandığım bu kod bir matris dönüşümü birikimi olmadığından, bu yöntemi kullanarak bir çözüm örneği verebilir misiniz?
Özet olarak:
- Döndürme ve yönlendirme arasındaki fark nedir?
- Kod neden matris dönüşümlerinin birikimi örneğinde değil?
- Eğer yanlış yapmış olsaydım, bir matrisin gerçek, özel amacı nedir?
- Matris dönüşümlerinin birikimi kullanılarak gimbal kilit problemine bir çözüm nasıl uygulanabilir?
- Ayrıca, bir bonus olarak: Döndürmeden sonraki dönüşümler neden hala "model uzayı" ile ilgilidir?
- Başka bir bonus: Bir dönüşümden sonra, akıma göre daha fazla dönüşüm gerçekleşeceği varsayımında yanlış mıyım?
Ayrıca, ima edilmemişse, OpenGL, GLSL, C ++ ve GLM kullanıyorum, bu yüzden bunlar açısından örnekler ve açıklamalar gerekli değilse büyük beğeni topluyor.
Daha fazla detay daha iyi!
Şimdiden teşekkürler.