Aslında, 'her iki yöne' sahip olamayacağınız ortaya çıkıyor: niyetiniz küre üzerinde herhangi bir 'mutlak yönelim' duygusu yoksa (yani, oyuncular her zaman örneğin direklere bakmıyorsa) ), oyuncu yönlendirmesi kavramına sahip olmanız gerekir. Sezgi önerebiliriz aksine, küre üzerinde hareket Bunun nedeni değil tam bir uçağa hareketi gibi, hatta lokal olarak (oldukça); kürenin kendine özgü eğriliği, oyuncuların kendilerini döndürecek eylemlerde bulunabileceği anlamına gelir!
Neden bahsettiğimin en uç örneği için, oyuncunun ekvatorda bir noktada başladığını düşünün (rahatlık için ekvatorda yukarıdan eşleştirilen bir saat yüzü hayal edeceğiz ve oynatıcıyı saat 6 yönünde koyacağız ), 'yukarıya' bakacak şekilde, yani Kuzey Kutbuna doğru. Diyelim ki oyuncu Kuzey Kutbuna kadar yürüyor; o zaman doğrudan saat 12 yönüne bakarlar. Şimdi, oyuncu Kuzey Kutbundan ekvatora doğrudan sağa hareket etsin; saat 3'te dönecekler - ama sağa doğru hareket ettiklerinde yüzleri değişmediği için(fikir şu ki, nasıl hareket ederlerse etsinler yüzleri değişmiyor), hala saat 12 yönünde karşı karşıya gelecekler - şimdi ekvator boyunca karşı karşıya kalıyorlar! Şimdi, 'geri' başlangıç noktalarına geri dönmelerine izin verin; o zaman hala ekvator boyunca karşı karşıya kalacaklar, bu yüzden saat 3'e doğru bakacaklar - sadece 'kişisel' yönlerini değiştirmeden küre boyunca hareket etmeleri, kuzey kutbuna bakacak şekilde dönmelerine neden oldu. ekvator boyunca bakacak! Bir anlamda, bu eski bir avcının bir ayrıntısıdır, bir avcı bir mil güneye, bir mil batıya ve sonra bir mil kuzey'e doğru şaka - ama burada yön değişikliğini gerçekleştirmek için kürenin eğriliğinden yararlanıyoruz. Aynı etkinin çok daha küçük ölçeklerde bile devam ettiğini unutmayın;
Neyse ki, kuaterniyonlar (sizin belirttiğiniz gibi) bu durumu ele alır; bir kuaterniyon keyfi bir dönüşü temsil ettiğinden, küre üzerinde keyfi bir 'nokta artı yönelimi' etkin bir şekilde temsil eder: başlangıçta bir 'üç eksenli' ile başlayıp ona keyfi bir dönüş sağlayın, ardından bir birimi döndürülen eksenler hangi yönde hareket ettirdiğinizi hayal edin Z ekseni noktaları; küçük bir düşünce, bunun sizi ünite küresinde bir miktar 'yönelim' (yani, üç ekseninizin X ve Y eksenlerinin bazı düzenlemeleri) ile bir noktaya getirdiğine ve her noktaya + yönelime erişebileceğinize ikna edecektir. birim küre bu şekilde (sadece Z ekseninizi, başlangıç noktasından küre üzerindeki noktaya doğru çizgi boyunca işaret edin, daha sonra üç eksenlerinizi bu satır boyunca başlangıç noktasına geri taşıyın). Daha ne, Kuaterniyonların çarpımı rotasyon kompozisyonuna karşılık geldiğinden, tarif ettiğiniz işlemlerin her biri 'mevcut yönelemenizi' uygun şekilde seçilmiş bir kuaterniyon ile çarparak temsil edilebilir: özellikle, (birim) kuaterniyondan (qx, qy, qz, qw) "arkcos (qw) ile (qx, qy, qz) ekseni etrafında döndür" anlamına gelir, ardından (özel koordinat sistemi seçiminize bağlı olarak ve c_a'nın cos (alfa) ve s_a günah (alfa) olmasına izin vermek) üç quaternion M_x = (s_a, 0, 0, c_a), M_y = (0, s_a, 0, c_a) ve M_z = (0, 0, s_a, c_a) 'I yönünde döndürme (yani taşıma) 'şu anda alfa ile karşı karşıyayım' ve 'şu anda alfa ile karşı karşıya olduğum yönün ortogonal bir yönünde dön'. (Bu kuaterniyonların üçüncüsü 'karakterimi kendi ekseni etrafında döndür'Cur_q = M_x * Cur_q
eğer oyuncu yukarı bastırdıysa veya Cur_q = M_y * Cur_q
oyuncu sağa Cur_q = M_yinv * Cur_q
bastıysa (veya oyuncu sola bastırmış gibi bir şey varsa, burada M_yinv M_y kuaterniyonunun 'tersidir, başka bir dönüşü temsil eder). İster premultiply ister postmultiply olsun, rotasyonu hangi 'tarafa uyguladığınıza dikkat etmeniz gerekir; açık söylemek gerekirse, bunu hem hata hem de deneme yöntemiyle çözmek, hata ve çarpımla çözmek en kolay yol olabilir.
Güncellenmiş kuaterniyonunuzdan küre üzerindeki bir noktaya (ve karakterinizin bir yönüne) gitmek de nispeten basittir: son paragrafın yazışmasına göre, yapmanız gereken tek şey kuaterniyonunuzu temel vektörlerde kullanmaktır (1, 0,0), (0,1,0) ve (0,0,1) karelerinizi 'vektörü kuaterniyona göre döndür' işlemi v → qvq -1 (burada çarpmaların kuaterniyon olduğu ve v = (x, y, z) 'dejenere kuaterniyon' (x, y, z, 0)) ile. Örneğin, birim küredeki konum sadece z vektörünü dönüştürerek elde edilir: pos = (qx, qy, qz, qw) * (0, 0, 1, 0) * (-qx, -qy, -qz, qw) = (qx, qy, qz, qw) * (qy, -qx, qw, qz) = (2 (qy * qw + qz * qx), 2 (qz * qy-qw * qx), (qz ^ 2 + qw ^ 2) - (qx ^ 2 + qy ^ 2), 0), yani(2(qy*qw+qz*qx), 2(qz*qy-qw*qx), (qz^2+qw^2)-(qx^2+qy^2))
birim küredeki 'dönüştürülmüş' kullanıcının koordinatları olurdu (ve keyfi bir küredeki koordinatları elde etmek için, elbette, bunları kürenin yarıçapıyla çarpacaksınız); benzer hesaplamalar, örneğin kullanıcının yönünü tanımlamak için diğer eksenler için de kullanılabilir.