Quaternion kullanan FPS kameramın eğilmesini ve dağılmasını nasıl önleyebilirim?


17

FPS benzeri bir kamera kullanıyorum ve kuaterniyonlar kullanıyor. Ama ne zaman yukarı bakıp yana bakmaya çalışsam, yatırır ve bazen baş aşağı dönebilir. Bunu nasıl düzeltebilirim?


3
(7 saat içinde kendi kendine cevap verecek) ...
Aeodyn

Yanıtlar:


16

Kuaterniyonunuzu bir yaw / pitch / roll açı kümesine ayırabilirsiniz, ancak bu genellikle fazladır.

Kuaterniyonlarınızı şöyle oluşturmak yerine:

cameraOrientation = cameraOrientation * framePitch * frameYaw;

Bunu dene:

cameraOrientation = framePitch * cameraOrientation * frameYaw;

Daha sonra asla eğim / rulo üretmez ve sapma ve eğimi ayrı olarak depolamaya eşdeğerdir


3
Bu. Tam da aradığım şey buydu. Sorunumu tek satırda çözdüm. Güzel!
aardvarkk

1
Çeşitleri framePitchve frameYaw floattürleri? Ayrıca, ilk cümleniz hakkında bazı açıklamalar için minnettar olurum.
sirdank

1
@sirdank cameraOrientation, framePitchve frameYawhepsi kuaterniyonlardır (her bir kuaterniyon 4 şamandıra veya iki kattır ).
Dan

8

Bu bir süredir yaşadığım bir problem ve cevap bulamadım, bu yüzden buraya göndereceğimi düşündüm.

Aslında oldukça basit. Büyük olasılıkla rotasyonları nasıl yapacağınız şöyledir:

currentDirection * newRotation;

Ama bunu böyle yapmak da işe yaramıyor.

newRotation * currentDirection;

Yapmanız gereken, yukarı ve aşağı rotasyonlar için ilk sırada ve yanlara doğru rotasyonlar için ikinci sırada yapmaktır.

Benim için şöyle oldu:

        if (keyboard.IsKeyDown(Keys.Up))
            Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), TurnSpeed);
        if (keyboard.IsKeyDown(Keys.Down))
            Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(-1, 0, 0), TurnSpeed);
        if (keyboard.IsKeyDown(Keys.Left))
            Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), TurnSpeed) * Direction;
        if (keyboard.IsKeyDown(Keys.Right))
            Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), TurnSpeed) * Direction;

Bir nedenden ötürü, ilk yol, yukarı ve aşağı doğru istediğiniz mevcut yan yöne göre rotasyona sahiptir, ancak yan rotasyonlar için bunu istemezsiniz, bu yüzden ikinci sıra gereklidir.


Kendi cevaplamak için 7 saat beklemek zorunda kaldım ...
Aeodyn

üzgünüm, bunu bazı ekran görüntüleri ile açıklayabilir misiniz? "birinci dereceden" ve "ikinci dereceden" biraz kafa karıştırıcı - teşekkürler!
Atav32

Kuaterniyonlarla çalışırken, düzen her zaman 3B dönüşlerde olduğu gibi önemlidir. Örneğimde, "Direction * = newRotation", "Direction = Direction * newRotation" ile aynıdır. Ancak, sol ve sağ rotasyonlarla, tam tersini istiyoruz. Bu, yuvarlanmaya neden olan yukarı ve aşağı eğime bağlı olmamasını sağlar.
Aeodyn

Oh, ancak quarternions'ın amacı, gimbal kilitten kaçınması ve rotasyonların bağımsız olmasıydı, ancak ders kitabını yanlış okumuş olabilirdim. Sadece açıklığa kavuşturmak için, dönme dönüşümlerinin sırasını tersine çevirirseniz, kameranın eğilmesini önleyebileceğinizi mi söylüyorsunuz? Ya da sapmayı döndürdüğünüzde, yuvarlanma ve eğim dönüşümlerini manuel olarak 0'a mı ayarlıyorsunuz?
Atav32

5

Bir FPS kamera için genellikle rulo istemezsiniz ve +/- 90 derece adımla sınırlandırılır, bu yüzden mevcut durumu sapma ve adım açılarını kullanarak izlerim. Kuaterniyonların tüm gücü bunun için gerçekten yararlı değil.

Kuaternion anahtar kare enterpolasyonu veya bunun gibi bir şey kullanarak FPS kamera ile animasyonlu kameralar arasında geçiş yapmak istiyorsanız, sapma / eğim açılarını kuaterniyonlara ve kuaterniyonlardan dönüştürebilirsiniz.


0

Başka bir basit numara, kamerayı bir GameObject'e koymak ve alt kamera Pitch koordinatları ile yapılandırılırken Yaw rotasyonunun oyun nesnesini kontrol etmesini sağlamaktır:

playerCameraHolder.transform.Rotate(0, rotationYaw, 0);
playerCamera.transform.Rotate(rotationPitch, 0, 0);
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.