Bir kuaternionda depolanan rotasyonu ile birinci şahıs bir kamerayı kodlamak istiyorum. Ne yazık ki rotasyonda bir sorun var.Bir dördüncüsü tüm eksen boyunca doğru bir şekilde nasıl döndürür?
şu fonksiyon kamerayı döndürmek için sorumludur. Mouse
ve Speed
parametreleri, fare hareketini ve dönüş hızını geçirir. Daha sonra işlev dönüş quaternion'unu getirir, döndürür ve sonucu kaydeder. Bu arada, türlerin ve işlevlerin nereden geldiği Bullet Physics kullanıyorum. Fare hareket, sana bir el çizimi gösterdiğinde
void Rotate(vec2 Mouse, float Speed)
{
btTransform transform = camera->getWorldTransform();
btQuaternion rotation = transform.getRotation();
Mouse = Mouse * Speed; // apply mouse sensitivity
btQuaternion change(Mouse.y, Mouse.x, 0); // create quaternion from angles
rotation = change * rotation; // rotate camera by that
transform.setRotation(rotation);
camera->setWorldTransform(transform);
}
çıkan kamera dönüşünü göstermek için. Sol tarafta kameranın gerçekte gösterdiği yanlış rotasyon gösterilir. Sağ tarafta istenen doğru durum gösterilmektedir. Oklar, fareyi yukarı (turuncu) ve aşağı (mavi) hareket ettirirken kameranın nasıl döndüğünü gösterir.
Gördüğünüz gibi
sürece yaw sıfır olduğu gibi rotasyon doğrudur. Ancak sahip olduğu daha fazla yaw, kameranın döndüğü daireler küçülüyor. Aksine, daireler her zaman bir küre gibi bir boylam boyunca akmalıdır.ben bak ben bunları doğru döndürmek için nasıl sormak quaternions ile çok aşina değilim.
Fare koordinatları, büyük olasılıkla ekran alanındadır; bu, onları böyle kullanmak için iyi bir fikir olmadığı anlamına gelir. Bunun yerine, bunları ters projeksiyon matrisini kullanarak dünya koordinatlarına dönüştürün. – BlackCat
Benim fikrim, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '; Sanırım çoğu oyunda böyle yapıldı. Yaklaşımın işe yarayıp yaramadığından emin değilim. Biraz daha açıklar mısınız? – danijar