1 puan yazan GN⁺ 2024-06-16 | 1 yorum | WhatsApp'ta paylaş
  • 3D döndürmelerde her temsil biçiminin güçlü yanları farklıdır; nokta dönüşümleri için döndürme matrisi kullanışlıdır, ancak enterpolasyon, bileşim ve ortalama için ayrı araçlar gerekir
  • Euler angles insanlar için kolaydır, ancak gimbal lock, sabit olmayan açısal hız ve en kısa yolu kaçıran doğrusal enterpolasyon sorunları doğurabilir
  • Birim quaternion, slerp ile sabit hızlı en kısa yol enterpolasyonu sağlar; ancak vektör uzayı olmadığı için doğrudan yazımı, skaler çarpımı ve ortalaması sezgisel değildir
  • Üstel/logaritmik haritalar, axis/angle vektörleri ile döndürme matrislerini bağlayarak R(t) = exp(t log(R1 R0^-1)) R0 biçiminde 2D ve 3D en kısa yol enterpolasyonu kurar
  • Birden çok döndürmenin ortalamasında yalnızca basit axis/angle ortalaması kullanmak catastrophic cancellation yaratabilir; Karcher mean ise açısal uzaklıkların kareleri toplamını en aza indiren döndürmeyi yinelemeli olarak bularak daha tutarlı sonuçlar üretir

Döndürme temsillerinin artıları ve eksileri

  • 3D döndürmeler için birden fazla temsil vardır; dönüşüm, yazım/oluşturma, enterpolasyon ve ortalama alma işlemlerinden hangisini yaptığınıza göre uygun seçim değişir
  • Döndürme matrisi

    • En doğrudan doğrusal cebir temsili, determinantı pozitif olan orthonormal 3x3 matrix’tir
    • Döndürme matrisinin üç sütunu, döndürmeden sonra x, y, z eksenlerinin nereye taşındığını gösterir
    • Nokta dönüşümü matris çarpımıyla yapılabilir ve diğer doğrusal dönüşümlerle de matris çarpımıyla bileştirilebilir
    • Ekrana çizerken döndürme matrisi kullanılmasının nedeni, noktaları world-space’ten screen’e taşımak için tek bir matris çarpımının yeterli olmasıdır
    • Döndürme matrisi bir vektör uzayı değildir; bu yüzden iki döndürme matrisi toplandığında sonuç yine bir döndürme matrisi olmaz
    • İki döndürme matrisi doğrusal olarak enterpole edilirse döndürmenin yanı sıra scaling de karışabilir
  • Euler angles

    • Euler angles, x, y, z eksenleri etrafında üç döndürme belirtir; pitch, yaw, roll olarak da adlandırılır
    • Üç bileşen döndürmenin uygulanma sırası kurala göre değişir; örnek x, y, z sırasını kullanır
    • İnsanların anlaması kolaydır ve döndürme yazımında sık kullanılır; ancak basit enterpolasyon istenmeyen sonuçlar üretebilir
    • Bir bileşen döndürme nedeniyle diğer iki döndürme ekseninin paralel hale geldiği gimbal lock, bir singularity durumudur
    • Singularity’de kilitlenen iki açıdan hangisini değiştirirseniz değiştirin aynı çıktı döndürmesi üretilebilir
    • Enterpolasyon yolu bir singularity’ye ulaşırsa mevcut konumu ifade etme serbestlik derecesi artar; devam etmek için keyfi bir temsil seçildiğinde çıktı enterpolasyonu süreksiz olabilir
    • Her bileşen açısı cyclic olduğu için doğrusal enterpolasyon iki döndürme arasındaki en kısa yolu her zaman seçemez
    • Yol singularity’den geçmiyorsa enterpolasyon pürüzsüzdür; “straight up” ve “straight down” durumlarını ifade etmeniz gerekmiyorsa sınırlar aşılabilir
  • Quaternions

    • Birim quaternion, döndürme bileşimi ve enterpolasyonu için standart araç olarak kullanılır
    • spherical linear interpolation, yani slerp, iki quaternion arasındaki sabit hızlı en kısa yolu seçer
    • Birim quaternion da vektör uzayı değildir; insanlar tarafından doğrudan yazılması zordur ve enterpolasyon hesaplama maliyeti doğurabilir
    • Skaler çarpım veya ortalama için de sezgisel bir kavram eksiktir
    • Quaternion, döndürme uzayını double-cover ettiği için bazı durumlarda Q(1) -Q1’e gidebilir
  • Axis/angle

    • Axis/angle döndürme, gerçek 3D vektörle temsil edilir
    • Vektörün yönü döndürme eksenini, büyüklüğü ise o eksen etrafındaki döndürme açısını belirtir
    • θu olarak yazılır; u birim vektördür, θ ise döndürme açısıdır
    • 3D vektör olduğu için vektör uzayı oluşturur; toplama, ölçekleme ve enterpolasyon yapılabilir
    • İki axis/angle döndürme doğrusal olarak enterpole edilirse pürüzsüz ve sabit açısal hızlı sonuç verebilir
    • Ancak hedef döndürmenin hangi axis/angle temsiliyle belirtildiğine bağlı olarak doğrusal enterpolasyon en kısa yolu seçemeyebilir
    • Quaternion gibi axis/angle vektörü de döndürme uzayını double-cover eder

Üstel harita ve logaritmik harita

  • Birden çok döndürme temsili arasında amaca uygun biçimde geçiş yapılabilirse her temsilin avantajları birlikte kullanılabilir
  • Nihai dönüşüm için döndürme matrisi gerektiğinden matrisi canonical form olarak alırız
  • exponential map, bir döndürme nesnesini alıp eşdeğer döndürme matrisini döndüren fonksiyondur
  • logarithmic map, döndürme matrisini alıp döndürme nesnesine geri çeviren karşılık fonksiyondur
  • Burada döndürme matrisi ile axis/angle vektörü arasında geçiş yapan exp ve log haritalarını ele alıyoruz

2D axis/angle’dan başlayan sezgi

  • 2D’de döndürme ekseni düzlemin dışına bakan tek bir eksendir; bu nedenle axis/angle döndürme tek bir θ açısıyla temsil edilebilir
  • 2D nokta p’nin θ kadar döndürülmüş hali olan şöyle yazılabilir
    • pθ = p cosθ + Jp sinθ
    • J, 2D vektörü 90 derece döndüren matristir
  • J, [[0, -1], [1, 0]]’dır ve J² = -I olduğundan iki kez uygulandığında 180 derece döndürme olur
  • Bu ifade açıldığında standart 2D döndürme matrisi [[cosθ, -sinθ], [sinθ, cosθ]] elde edilir

2D üstel harita ve logaritmik harita

  • Karmaşık sayıların Euler formülü e^(iθ) = cosθ + i sinθ içinde i nasıl quarter turn rolünü oynuyorsa, 2D matris ifadesinde de J aynı rolü oynar
  • Üstel fonksiyonun Taylor series’ine A = θJ matrisi koyulduğunda aynı hesaplama matris toplama, çarpma ve ölçeklemeyle yapılabilir
  • Açılım sonucunda sinθ ve cosθ Taylor series’leri ortaya çıkar ve şu ifade elde edilir
    • e^(θJ) = [[cosθ, -sinθ], [sinθ, cosθ]]
  • Dolayısıyla 2D üstel harita, θ açısını karşılık gelen döndürme matrisine dönüştürür
  • Logaritmik harita, üstel haritanın tersi olarak tanımlanır
    • R = exp(θJ) ise log(R) = θJ
    • θ = atan2(R21, R11) ile geri elde edilebilir
  • Üstel harita injective değildir
    • exp(θJ) = exp((θ + 2π)J) olduğundan bir tam tur eklemek aynı döndürme matrisini verir
    • Logaritmik harita, ilgili döndürme matrisine karşılık gelen en küçük açıyı döndürecek şekilde tanımlanır
    • atan2 bu tanımı uygular

exp/log tabanlı enterpolasyon

  • İki 2D döndürme açısı θ0, θ1 basitçe doğrusal enterpole edilip ardından döndürme matrisi oluşturulabilir
  • Ancak θ0 ve θ1 birbirinden π’den daha uzaktaysa açıların cyclic niteliği yansıtılamaz ve uzun yol seçilir
  • exp/log tabanlı enterpolasyon, iki döndürme matrisi R0, R1 üzerinden hareket döndürmesini doğrudan hesaplar
    • R1 R0^-1, önce R0’ı geri alıp sonra R1’i uygulayan döndürmedir
    • log(R1 R0^-1), R0’dan R1’e giden en küçük açıyı sağlar
    • Bu axis/angle döndürme t ile ölçeklenir ve exp ile tekrar matrise çevrilir
  • Nihai enterpolasyon formülü şöyledir
    • R(t) = exp(t log(R1 R0^-1)) R0
    • R(0) = R0, R(1) = R1
  • 2D’de açı farkı doğrudan kontrol edilebilir, ancak bu yöntem değişiklik gerektirmeden 3D’ye ve herhangi bir boyuta genellenir

3D axis/angle ve skew-symmetric matrix

  • 3D’de de axis/angle θu üstel hale getirilerek döndürme matrisi oluşturulabilir
  • Temel nokta, birim vektör u’yu eksen alan quarter turn dönüşümünü bulmaktır
  • Cross product u × p, u ve p’nin oluşturduğu düzleme dik bir vektör olarak tanımlanır; ancak p’nin u’ya dik düzleme izdüşümü olan p⊥ için bir quarter turn olarak da yorumlanabilir
  • u × p ile aynı sonucu veren û matrisi oluşturulabilir
    • û = [[0, -uz, uy], [uz, 0, -ux], [-uy, ux, 0]]
    • ûp = u × p
  • ûᵀ = -û olduğundan û bir skew-symmetric matrix’tir
  • 2D’deki J de skew-symmetric’tir ve 2D cross product’ı temsil eder; dolayısıyla aynı yapı sürer
  • Skew-symmetric matrix’lerin toplamı ve skaler çarpımı da skew-symmetric olduğundan axis/angle vektör uzayı özelliği bu matris temsilinde de korunur
  • û^(k+2) = -û^k özdeşliği, cross product’ı üç kez uygulamanın p⊥ üzerinde üç quarter turn yapıp negatif quarter turn’e eşdeğer olması şeklindeki geometrik yorumdan gelir

3D üstel harita: Rodrigues’ formula

  • Axis/angle döndürme θu’dan θû oluşturulup üstel hale getirildiğinde 3D döndürme matrisi elde edilir
  • Taylor series ve û^(k+2) = -û^k kullanıldığında şu ifade türetilir
    • e^(θû) = I + sin(θ)û + (1 - cos(θ))û²
  • Bu ifade Rodrigues’ formula olarak bilinir
  • θ = 0 ise e^(0û)p = p olur ve nokta aynı kalır
  • θ = π/2 ise u × p + p∥ olur; bu bir quarter rotation’dır
  • θ = π ise -p⊥ + p∥ olur; bu bir half rotation’dır
  • Bu matris orthonormal’dır
    • AᵀA = I koşulu ûᵀ = -û ve û^(k+2) = -û^k ile doğrulanır
  • Determinant θ = 0 iken 1’dir; determinantın 0 olduğu bir durum yoktur ve exp, θ ile û açısından sürekli olduğundan negatif olamaz
  • Dolayısıyla exp(θû) bir 3D döndürme matrisidir

3D logaritmik harita

  • 3D üstel harita da injective değildir; bu yüzden 3D logaritmik harita verilen matrise karşılık gelen en küçük büyüklükteki axis/angle döndürmeyi döndürecek şekilde tanımlanır
  • R = exp(θû) = I + sin(θ)û + (1 - cos(θ))û² ifadesinde trace alınarak döndürme açısı bulunabilir
    • trace, köşegen toplamıdır
    • tr(I) = 3
    • û skew-symmetric olduğundan köşegen toplamı 0’dır
    • tr(û²) = -2’dir
    • Dolayısıyla tr(R) = 1 + 2cosθ
    • θ = arccos((tr(R) - 1) / 2)
  • Döndürme ekseni, R antisymmetrize edilerek geri elde edilir
    • R - Rᵀ = 2 sin(θ)û
    • û = (R - Rᵀ) / (2 sinθ)
    • u = 1/(2 sinθ) [R32 - R23, R13 - R31, R21 - R12]ᵀ
  • Böylece 3D döndürme matrisinden axis/angle’a dönen tam logaritmik harita tamamlanır

3D enterpolasyonun sonucu

  • 3D’de de 2D ile aynı enterpolasyon formülü aynen uygulanır
    • R(t) = exp(t log(R1 R0^-1)) R0
  • Bu enterpolasyon axis/angle döndürmenin avantajlarını korurken her zaman en kısa yolu seçer
  • Euler angles ile aynı örnek pürüzsüz görünmeyebilir

Birden çok döndürmenin ortalaması

  • Quaternion kullanıldığında iyi enterpolasyon elde edilebilir; exp/log matris matematiği olmadan da enterpolasyon sorunu çözülebilir
  • Axis/angle döndürmelerle daha kolay yapılabilen işlerden biri, birden çok döndürme matrisinin ortalamasını almaktır
  • En basit yöntem her matrisi axis/angle’a çevirmek, vektörlerin ortalamasını almak ve tekrar dönüştürmektir
  • Bu yöntem geçerlidir, ancak sezgisel olmayan davranışlar üretebilir
  • Özellikle axis/angle vektörleri birleştirildiğinde catastrophic cancellation oluşabilir
    • Örnek olarak [π, 0, 0] ile [-π, 0, 0] ortalandığında 0 elde edilir
    • Bu iki değer eşdeğer döndürmelerdir, fakat ortalama sonucu olan 0 iki döndürmeyi temsil edemez

Karcher mean

  • Düzlemdeki noktaların ortalaması, tüm noktalara olan toplam kare mesafeyi en aza indiren nokta olarak görülebilir
  • Bunu yinelemeli optimizasyonla bulma prosedürü şöyledir
    • Başlangıç tahmini olarak x̄ ∈ R² seçilir
    • Her noktadan tahmine translation ui = xi - x̄ hesaplanır
    • Vektör ortalaması u = (1/n) Σ ui bulunur
    • x̄ = x̄ + τu ile ortalama yönünde hareket edilir
    • |u| > ε olduğu sürece tekrarlanır
  • Aynı fikir döndürmeler R0, ..., Rn için uygulanabilir
    • Başlangıç tahmini döndürme olarak R̄ ∈ R^(3×3) seçilir
    • Her matris için tahminden ilgili döndürmeye giden axis/angle ui = log(Ri R̄^-1) hesaplanır
    • Vektör ortalaması u = (1/n) Σ ui bulunur
    • R̄ = exp(τu) R̄ ile ortalama döndürme yönünde hareket edilir
    • |u| > ε olduğu sürece tekrarlanır
  • Bu algoritmanın sonucu Karcher mean’dir
  • Karcher mean, diğer tüm döndürmelere olan kare açısal uzaklıkları en aza indiren döndürmedir
  • Catastrophic cancellation’dan etkilenmez ve her zaman sıfır olmayan ara bir döndürmeye yakınsar
  • Basit axis/angle ortalaması ile Karcher mean’in sonuçları çoğu zaman benzerdir, ancak Karcher mean daha tutarlı davranış gösterir

Quaternion ile exp/log ilişkisi

  • Bu bölüm quaternion bilgisi varsayar
  • Karmaşık sayı üstel hale getirmenin skew-symmetric 2D matris üstel hale getirmeye eşdeğer olması gibi, quaternion üstel hale getirme de skew-symmetric 3D matris üstel hale getirmeye eşdeğerdir
  • 2D’de axis/angle döndürme θ ile pure-imaginary complex number oluşturulur ve üstel hale getirilir
    • e^(iθ) = cosθ + i sinθ
    • Sonuç, bir noktaya çarpıldığında onu θ kadar döndüren karmaşık sayıdır
    • Normu her zaman 1 olduğundan 2D döndürme unit-norm complex number ile temsil edilebilir
  • 3D’de axis/angle döndürme vektörü u’dan pure-imaginary quaternion q = ux i + uy j + uz k oluşturulabilir
  • Quaternion çarpım kuralları kullanıldığında q² = -||q||² = -θ² olur; bu da skew-symmetric matrix’te kullanılan özdeşliğe benzer
  • Üstel hale getirme sonucu şöyledir
    • e^q = cosθ + (q/θ) sinθ
    • 2D ifadeye neredeyse aynıdır, ancak imaginary axis bir değil üç tanedir
  • 3D axis/angle döndürme unit-norm quaternion’a dönüştürülür
  • Rotation matrix gerekmiyorsa quaternion üstel haritası hesaplaması kolay bir seçenektir
  • Quaternion logaritmik haritası da basittir
    • θ = arccos(Re(q))
    • u = Im(q) / sinθ
  • Quaternion q ile nokta p’yi döndürmek için conjugation q p q^-1 hesaplanır
    • Nokta, p = px i + py j + pz k olan pure-imaginary quaternion olarak temsil edilir
    • Conjugation teknik olarak u ekseni etrafında kadar döndürdüğü için başlangıçta |u| = θ/2 almak yeterlidir

Ek okumalar

1 yorum

 
GN⁺ 2024-06-16
Hacker News yorumları
  • Lie grubu/Lie cebiri karşılığı, okulda öğrenmiş olmayı isteyeceğim en harika kavramlardan biri. Yazıda bahsedilen üstel eşleme ve logaritma eşlemesi bu, ama çok daha yeniden kullanılabilir bir biçimde ortaya çıkıyor.
    3B dönme gibi ele almak istediğiniz soyut nesneyi, koordinatların ayrıntılarına takılmadan yakalarsanız bu bir Lie grubu olur; buradan iyi çalışan bir koordinat gösterimi türetirseniz de karşılık gelen Lie cebiri elde edilir.
    Böylece koordinatlar ile soyut nesne arasında gidip gelme, bileştirme vb. yöntemler neredeyse bedavaya gelir; mühendislikte sık karşılaşılan durumlarda interpolasyon ve ortalama alma da oldukça makul biçimde ele alınabilir.
    Bir problemi Lie gruplarının birleşimi olarak ifade edebiliyorsanız, her bir cebirin ne olduğunu bulup normalde elle yapması uzun sürecek pek çok işten tasarruf edebilirsiniz.
    Burada nesnenin düzgün değişim kavramına ve biraz ek yapıya sahip olması gerekir; gidip gelme sürecinde bağlantılı bileşen sorunları da çıkabilir, ama zaten bilinen sonuçları ödünç almanın bu kadar işe yaramasının nedenlerinden biri de budur.

  • Uzun bir hafta neredeyse biterken, bir ineği döndürmek için kaydırıcılarla oynamak tam ihtiyacım olan molaydı.

    • Bir sürü sayı görür görmez gözlerim buğulandı, ama inek gerçekten çok sevimliydi.
    • Düşük eforlu bir iOS cash cow oyunu olarak tam yerini bulacak gibi.
  • Pek çok 3B yazılımın dönme için Arcball arayüzü kullanmaması uzun süredir şikâyet ettiğim bir konu.
    Autodesk ürünleri olan 3DSmax ve Maya bunu kullanıyor; Blender ve OpenSCAD kullanmıyor. Roblox’ta çalışırken de mevcut yöntemlerle kullanıcıların idare edebildiği gerekçesiyle PM’i ikna edememiştim.
    Arcball kuaterniyon tabanlıdır, interpolasyonda üstel fonksiyon kullanır; tek bir sürüklemeyle herhangi bir dönmeyi mümkün kılar, gimbal lock yoktur ve kapalı bir döngü çizerek sürüklerseniz başlangıç konumuna geri dönersiniz.
    Birim kuaterniyonların SO(3)’ün 2 katlı örtüsü olmasından matematiksel olarak kanıtlanabilir; çember üzerindeki dönmeleri birim karmaşık sayıların tam olarak ifade etmesine benzer.
    Elle deneyebileceğiniz bir kuaterniyon/Arcball referans uygulaması: https://romankogan.net/math/arcball_js/index.html
    Kod, bol yorumlu Java; Processing kütüphanesini ProcessingJS ile JavaScript’te çalıştırıyor.
    Eller ve beden, kuaterniyonları beyinden önce anlayabilir; bu yüzden 3B yazılım yapıyorsanız bu yöntemi kullanmanız iyi olur.
    Arcball: http://courses.cms.caltech.edu/cs171/assignments/hw3/hw3-not...
    Dönme için kuaterniyonlar: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotati...
    Processing’de Arcball: https://romankogan.net/math/arcball_js/index.html

    • Ortadan değil de sağ taraf gibi bir noktadan sürükleyince neden çok daha kötü hissettirdiğini merak ediyorum. Bir şeye takılıyormuş gibi geliyor ve bazen sıçrıyor; dönmeyi hesaplamak için kullanılan referans noktası değişiyorsa, bunun anlamı ekranda görsel olarak belli olmalı gibi.
    • Mobilde de çalışacak hale getirilip getirilemeyeceğini merak ediyorum.
      Şu an mobilde bakıyorum; https://asliceofrendering.com/camera/2019/11/30/ArcballCamer... Arcball’u anlamama yardımcı oldu.
  • Bu bağlamda kuaterniyonların neden bu kadar sevildiğini pek anlamıyorum. Matrislerin kuaterniyonlardan daha az sezgisel olduğunu söylemek zor.
    Matrisler vektörlere etki eder; dönmeler de vektörlere etki eder. Bu yüzden dönmeleri matris olarak görmekten daha doğal ne olabilir bilmiyorum.
    Matris üstelini de adi diferansiyel denklemlerle ilişkilendirince sezgiseldir. dx/dt = Ax denkleminin çözümü exp(t A)dır; A antisimetrikse x’teki değişim her zaman x’e diktir, dolayısıyla uzunluğu değiştirmeyen bir dönme olur.
    Lie grubu/Lie cebiri bunu büyük ölçüde genelleştirir, ama özünde dik değişimleri sürekli biçimde üretip dönme oluşturmak ve üstel eşlemenin bu süreci açıklaması vardır. Bu resim bana çok daha geometrik ve sezgisel geliyor.

    • Kuaterniyonların kendisi de çoğu zaman Pauli matrisleri gibi matrislerle temsil edilir; bu da kuantum spin modellemesinde yaygın kullanılır.
      Kuaterniyonların avantajının, aynı matris çarpımını elle hesaplamaya kıyasla kâğıt kalemle uğraşmasının daha kolay olması olduğunu düşünüyorum.
      Kişisel olarak karmaşık sayılara benzer anlamda sezgisel geliyor. Başta tuhaftı, ama artık bildiğim alternatiflerden daha basit kullanılıyor ve daha kolay akıl yürütülüyor gibi geliyor.
    • Yazı da kuaterniyonların matrislere göre büyük avantajını açıklamıştı. Kuaterniyonlarda interpolasyon iyi çalışır, matrislerde ise çalışmaz.
      Bu özellik, animasyonlarda veya 3B spline eğrileri boyunca frame hesaplanan grafik işlerinde çok önemlidir.
    • Hesaplama açısından kuaterniyonların avantajı, 3x3 matrislerdeki 9 sayı yerine yalnızca 4 sayı kullanmaları ve dönmeyi uygularken de işlem miktarını benzer şekilde azaltmalarıdır.
    • Kuaterniyonların temel avantajı dönme bileştirmesidir.
      2B dönmeleri karmaşık sayılarla ele almaya benzer: iki karmaşık sayıyı çarptığınızda dönmeler bileştirilir ve 2B’de argümanların toplanması biçimini alır. Aynı şekilde iki kuaterniyonu çarparak 3B dönmeleri bileştirebilirsiniz; bu, 3x3 matris çarpımından çok daha verimlidir.
      Sezgi vermek için söylemek gerekirse kuaterniyonlar eksen-açı gösterimiyle yakından ilişkilidir; bu da Lie cebiri so(3) ile aynıdır.
      Vektörlere etki etme açısından bakarsak, çeşitli dönme parametreleştirmelerini aynı soyut Rotation özelliğinin uygulamaları olarak görebiliriz. İç uygulama matris, kuaterniyon, Euler vektörü, Euler açıları veya Gibbs vektörü olsun, dönmelerin vektörlere etki etme ve bileştirilme biçimi aynıdır.
  • Birim kuaterniyonlar bir Lie grubudur; gelişigüzel toplayabileceğiniz bir şey istiyorsanız, dönme hızını temsil eden tüm kuaterniyonların Lie cebirine bakmak gerekir. Bu, eksen-açı dönme hızını temsil etmekle aynıdır.
    Birim kuaterniyonlarla eksen-açıyı karşılaştırmak kategorileri biraz karıştırır; birim kuaterniyonları dönme matrisleriyle, tüm kuaterniyonları da eksen-açıyla karşılaştırmak daha uygundur.
    Kuaterniyon kullanmanın avantajı üstel eşlemeyi kolay hesaplayabilmektir, ama kuaterniyon kullanırken dönme matrislerine pek ihtiyaç duyulmaz. Yazıdaki gibi pqp^-1 ile dönüş hesaplanabilir.
    Kuaterniyonları anlamanın en kolay yolunun geometrik cebiri okumak olduğunu düşünüyorum. Kuaterniyonların icadı yüzlerce yıl sürdü, ama şaşırtıcı derecede basit geometrik cebiri anladığınızda kuaterniyonları birkaç dakika içinde yeniden icat edebilirsiniz.
    Birkaç yıl önce iyi bir giriş olarak gördüğüm yazı: https://crypto.stanford.edu/~blynn/haskell/ga.html

    • Dönmeleri düşünürken hâlâ üstel eşlemenin en sağlam yöntem olduğunu düşünüyorum. Çünkü SO(3)'ün Lie grubunu koordinat dönüşümü, türev alma ve teğet uzay işlemlerine kadar en doğrudan şekilde ele almayı sağlıyor.
      Geometrik cebirin çeşitli formülasyonlarından geçseniz de sonunda SO(3)/SE(3) uzayını ifade etmek için rotorlar ve motorlar kullanıyorsunuz; bunlar da sırasıyla kuaterniyonlara ve dual kuaterniyonlara izomorfiktir.
      Ama amaç buysa, üstel eşlemeyle birlikte 3x3 dönme matrisleri ve 4x4 dönüşüm matrislerinin hâlâ çok daha kullanışlı olduğunu düşünüyorum. Kuaterniyonlar daha az depolama alanı kullanır ve birbirleriyle çarpmaları da hızlıdır, ancak noktaları dönüştürürken matrisler daha hızlıdır; toplam verimlilik duruma göre değişir.
    • Burada “tüm kuaterniyonlar” derken saf sanal kuaterniyonları mı kastettiğinizi merak ediyorum.
  • Üniversitede öğrendiğim harika şeylerden biri, + operatörünü matris ve vektör uzayı değişim miktarına göre, - operatörünü de iki matrise göre yeniden tanımlarsanız Kalman filtresi durumunun içine dönme matrisini doğrudan koyabilmenizdi.
    Böylece gimbal lock endişesi olmadan dönmeyi tahmin edebiliyorsunuz.
    https://openslam-org.github.io/MTK

    • SO(2)'nin teğet uzayını durum olarak tutmak mı kastediliyor, merak ediyorum.
    • Teğet uzayda + operatörünü uygulamak yalnızca Kalman filtrelerinde değil, genel olarak doğrusal olmayan optimizasyonda da oldukça yaygın. Ceres kütüphanesi de bunun için LocalParameterization desteği sunuyor.
  • Gerçekten iyiydi; yalnızca küçük bir kısmı iyi değildi.
    Bu yöntemlerin sonuçta standart dönme matrisini hesaplaması özellikle hoşuma gitti. Bir milyon vektörü döndürmeniz gerekiyorsa, ilginç hesabı yalnızca bir kez yapar, sonrasında yüksek derecede optimize edilmiş matris çarpımı hattını çalıştırırsınız.

  • Güzel bir blogdu; yazar profilini tıklayıp diğer yazılara bakarken “2010 civarında, 9 yaşındayken programlamayla ilk kez tanıştım” cümlesini gördüm.
    Ben 2010'da 13 yaşındaydım ve ortaokul matematiğiyle fenini kafama sokmaya çalışıyordum.
    Harika bilgisayar grafikleri yazıları gördüğüm her seferinde, bunları benden daha genç ve çok daha yetenekli biri yazmış gibi geliyor ve ciddi bir aşağılık duygusu hissediyorum.

    • Henüz geç değil. Son birkaç yılda kendi kendime niş bir teknolojiyi öğrendim ve bir büyük şirket bunu para verip kullanmak istiyor gibi görünüyor. Yaşım yaklaşık 35.
      Yine de nasıl yapılacağına dair pek iyi tavsiye veremem. Sadece bunu gerçekten sevdiğim için yapmaya devam ettim. Buna rağmen yapılandırılmış pratik gibi şeylerin de işe yarama ihtimali var gibi görünüyor.
  • Birden çok dönmenin ortalamasını alma yöntemini ararken https://mathweb.ucsd.edu/~sbuss/ResearchWeb/spheremean/paper... adresini buldum.
    Bu yazıdaki yöntem, en azından benim matematik seviyemde, o makaleden çok daha kolay görünüyor.

    • Birden çok dönmenin ortalamasını almak istemenizin bağlamını merak ediyorum.
      Ortalama, toplamla yapılabilen bir işlemdir ve toplamda bileşim sırası önemli değildir. Ama dönmeler değişme özelliğine uymaz; bu yüzden normalde anladığımız ortalama kavramı doğrudan uygulanmaz.
      Telefonu elinizde tutup ekranı 180° çevirerek sizden uzağa baktırdıktan sonra, yere göre saat yönünde 90° döndürürseniz kamera sola bakar. Tersine, aynı iki dönmeyi ters sırada yaparsanız kamera sağa bakar.
      Bu iki dönmenin “ortalamasında” kameranın nereye bakması gerektiğine dair tek bir cevap yoktur; ortalamadan istediğiniz özelliklere bağlıdır.
    • Birkaç gün önce düzlem dönmeleriyle ilgili biraz yan bir yorum yazmıştım. Düzlemde bu çok daha basitleşiyor; programlama ortamı karmaşık sayı işlemlerini birinci sınıf özellik olarak destekliyorsa özellikle kullanışlı oluyor.
      https://news.ycombinator.com/item?id=40333541
      Temel sezgi şu: toplama ötelemedir, çarpma ise dönmedir. Bu yüzden ortalama öteleme için aritmetik ortalama, ortalama dönme için geometrik ortalama kullanılabilir.
  • Matematikte de, yazılım mühendisliğinde soyutlamayı düşünmeye benzer şekilde soyutlamalar üretildiğini fark etmem uzun sürdü.
    Çocukken neden sanal sayıların icat edildiğini, matrislerin tam olarak ne anlama geldiğini kafam almıyordu.
    Ancak sonradan bu gösterimlerin tasarlanmış şeyler olduğunu anladım. Sanal sayı diye bir şey oluşturunca bazı hesaplar kolaylaşıyor; doğrusal denklemleri matris olarak yazınca bütünü açıp yazmaktan çok daha kolay akıl yürütülüyor.
    Bariz görünüyor ama kimse bunu bana böyle anlatmamıştı.

    • Daha soyut matematik çalışsanız da bu bakış açısı geçerliliğini koruyor. Örneğin grup bir arayüzdür; “bir grup” da gereken üç özelliği/metodu uygulayan bir işleme sahip bir tip olarak görülebilir.
      Vektör uzayları, halkalar, metrik uzaylar ve kategoriler de aynı şekilde; matematik, tasarım kalıbı olarak arayüzlerle doludur.
      Ancak matematikteki arayüzler, programlamadaki kalıtımdan çok type class'lara daha yakındır. Çünkü aynı küme/tip farklı şekillerde grup olabilir.