İstediğinize Arcball dönüşü denir. Kuaterniyonlar ancak nasıl çalıştıklarını anlarsanız kolay çözümdür. Ancak aynısını quaternions olmadan da yapabilirsiniz.
Ön koşul
Genel olarak nesnelerin nasıl döndürüleceğini biliyor musunuz? Diyelim ki başlangıç noktasında bir nesneniz var. Nasıl döndürdüğünüzü biliyor musunuz (ipucu: bazı döndürme matrisi ile çarpın)? Evet ise, önce nesneyi çevirir ve sonra döndürürseniz ne olacağını bildiğinizi varsayıyorum?
Bir açı matrisini açı ekseninden nasıl hesaplayacağınızı bilmelisiniz (pasta gibi kolay, sayısız denkleme çevrimiçi bakın, birçoğu size kodu verir)
Çözüm
- Kameranın yukarı ve sağ vektörlerini alın. Normalleştirilmesi gerektiğini unutmayın.
- Vektörü netleme noktasından kameraya alın (camPosition - Focus). Bu, döndüreceğiniz vektördür. Bu camFocusVector diyelim .
- Kameraya göre yaw / pitch'de ne kadar döndürmek istediğinize karar verin
- İki dönme matrisi oluşturun. 1. dönüş matrisi, karar verdiğiniz eksen ve sapma açısı olarak kameranın üst kısmını kullanır . 2 rotasyon matrisi kullanacak hakkı ekseni gibi kameranın Saha sen karar açısı.
- Şimdi yeni dönme matrisleriyle camFocusVector öğesini döndürün . Bu, artık kameranın başlangıç noktasına göre yeni konumunuzdur. Tabii ki, odak noktasına göre olmasını istiyoruz ...
- Netleme noktası konumunu camFocusVector öğesine ekleyin . Bu şimdi kameranızın yeni pozisyonu. Kameranızı uygun şekilde çevirin.
- Son olarak, lookAt () işlevinizi çağırarak kameradan odak noktasına odaklanmasını isteyin
Uyarılar
Kameranızın çalışmayı durduracağı belirli durumlara veya tekilliklere dikkat etmeniz gerekir. Örneğin düz aşağı / yukarı bakıyorum. Bunlarla nasıl başa çıkacağınızı anlamanıza izin vereceğim.
EDIT1: Kameranın ortonormal vektörleri nasıl yeniden hesaplanır
Kameranın yönünü zaten biliyorsunuz ((cameraPos - focusPoint) .normalize ()). Şimdi kameranızın yukarı + Y (veya dünyanızın mevcut yukarı ekseni ... yani size kalmış) olduğunu varsayın. Şimdi sadece çapraz yön ile yukarı almak için hakkı . Bitti? Hayır! Yukarı vektörünüz artık diğer ikisine dik değil. O, çapraz düzeltmek için hakkı ile yön ve yeni olsun yukarı .
O Not Gram-Schmidt orthonormalize vektörlere kullanılması gerektiğini gerçekten ne olduğunu.
Yine, bazı durumlarda işe yaramayacağı için uyarıları not edin ( örneğin , yön yukarıya paraleldir ).