Nathan Reed ve teodron maruz kaldıkça, bir v vektörünü birim uzunluktaki kuaterniyon q ile döndürmenin tarifi şöyledir:
1) saf Dördey oluşturma p üzerinden v . Bu sadece 0'ın dördüncü koordinatını eklemek anlamına gelir:
p=(vx,vy,vz,0)⇔p=(v,0)
2) q ile önceden çarpın ve q * konjugatı ile çarpın :
p′=q×p×q∗
3) Bu, bir vektöre geri döndürülebilen başka bir saf kuaterniyonla sonuçlanacaktır:
v′=(p′x,p′y,p′z)
v′vq
Bu çalışıyor ama optimal olmaktan uzak . Kuaterniyon çarpımları, ton ve ton işlem anlamına gelir. Bunun gibi çeşitli uygulamaları merak ediyordum ve nereden geldiklerini bulmaya karar verdim. İşte bulgularım.
Ayrıca tanımlayabiliriz q , 3-boyutlu bir vektör kombinasyonu olarak U ve skalar s :
q=(ux,uy,uz,s)⇔q=(u,s)
Kuaterniyon çarpımı kuralları ile ve birim uzunluklu kuaterniyonun eşleniği basitçe ters olduğu için:
p′=qpq∗=(u,s)(v,0)(−u,s)=(sv+u×v,−u⋅v)(−u,s)=((−u⋅v)(−u)+s(sv+u× v)+(sv+u×v)×(−u),…)=((u⋅v)u+s2v+s(u×v)+sv×(−u)+(u×v)×(−u),…)
Skaler kısım (elipsler), burada ayrıntılı olarak açıklandığı gibi sıfırla sonuçlanır . İlginç olan vektör kısmı, AKA bizim döndürülmüş vektörümüz v ' . Bazı temel vektör kimlikleri kullanılarak basitleştirilebilir :
v′=(u⋅v)u+s2v+s(u×v)+s(u×v)+u×(u×v)=(u⋅v)u+s2v+2s(u×v)+(u⋅v)u−(u⋅u)v=2(u⋅v)u+(s2−u⋅u)v+2s(u×v)
Bu şimdi çok daha uygun ; iki nokta ürün, çapraz ürün ve birkaç ekstra: işlemlerin yaklaşık yarısı. Kaynak kodunda buna benzer bir şey verecek (bazı genel vektör matematik kütüphanelerini varsayarsak):
void rotate_vector_by_quaternion(const Vector3& v, const Quaternion& q, Vector3& vprime)
{
// Extract the vector part of the quaternion
Vector3 u(q.x, q.y, q.z);
// Extract the scalar part of the quaternion
float s = q.w;
// Do the math
vprime = 2.0f * dot(u, v) * u
+ (s*s - dot(u, u)) * v
+ 2.0f * s * cross(u, v);
}