3. kişi kamerayı hedefe doğru döndürme


10

Doğrudan oyuncuya değil, önünde bir yere bakan 3. kişi kameram var.

Kullanıcı çekim moduna girdiğinde, kameranın hedefe bakması için oynatıcının etrafında dönmesini istiyorum.

bahsettiğim şeyin örneği

Yukarıdaki resimde. "O" oynatıcı (Orijin), "L" arama, "C" kamera konumu ve "T" hedeftir. C -> L gözetleme çizgisini Kök ("O") etrafında T (C '-> L' -> T ') geçecek şekilde döndürmek istiyorum.

Temelde resimde kırmızıya koyduğum alfa açısını bulmam gerekiyor.

Kamera konumumu şöyle bir yapıda saklıyorum:

struct CameraTarget {
     Quaternion absoluteRotation;
     Vec3 absolutePosition;
     Vec3 cameraOffset;
     Vec3 lookatOffset;
     float FOV;
}

Aradığım açıyı bulabilirsem şöyle bir şey yapabilirim:

cam->absoluteRotation = cam->absoluteRotation * alpha;

Oyuncunun her zaman hedefe bakmasını sağlamak için.

Uyanık Kökeni geçiyorsa,

Vec3 origDir = cam->lookAtOffset - cam->absolutePosition;
origDir.normalize();
Vec3 newDir = cam->target - cam->absolutePosition;
newDir.normalize();
Quaternion q(origDir, newDir); // from->to
cam->absoluteRotation = cam->absoluteRotation * q;

Bununla birlikte, yukarıdaki şemada, rotasyon Origin'den ofsetlendiği için bu işe yaramaz.

Yanıtlar:


1

Bir gün başka birine yardım ederse kendime cevap vermek:

SFDKT, hedef noktayı mevcut kamera görünüm yönüne yansıtmak konusunda doğru fikre sahiptir.

Ancak en büyük sorunum bu noktayı bulmaktı. Biraz trigonometrinin bunu çözmeyi başardığı ortaya çıktı.

Üç nokta CPO tarafından oluşturulan üçgen göz önüne alındığında:

  1. LO, OC ve CL uzunluklarını bildiğim için C'deki açıyı hesaplayabilirim.

  2. Şimdi C açısını, OC ve PO uzunluğunu biliyorum. Sinüs yasasını kullanarak O'daki açıyı bulabilirsiniz. ( Bu web sitesini eksik açıları bulmak için çok yararlı buldum )

  3. Sonra son eksik P açısını bulabilir ve CP uzunluğunu bulmak için tekrar Sines yasasını kullanabilirim.

  4. Bakış yönünü al posC + normalleştirilmiş (CL) * uzunlukCP bana P konumunu verir.

  5. Bir kez PI OP ve OT arasındaki en kısa rotasyonu hesaplayabilir, bu da bana kameramı döndürmem için gereken kuaterniyonu verir.

3D'de istenmeyen rulo ile biraz sorun yaşadım ama Z = 0 ile sorunu çözdüm, sonra kameranın yukarı vektörünü düz tutmak için eksik adım döndürmeyi hesapladım.


0

bu resim soruyu daha kolay çözmek için gerekli simetriyi ekler.

resim açıklamasını buraya girin

Sadece Lvektör boyunca yansıtın CLböylece |P-O|=|T-O|.

Şimdi açıkçası istediğiniz açıya göre döndürülmüş iki özdeş üçgen ( CPOve C'TO). IEang(OT)-ang(OP)

C've L'her ikisi de aynıdır Cve Lilgili döner sonra Oaynı miktarda.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.