Yanıtlar:
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
framePitch
ve frameYaw
float
türleri? Ayrıca, ilk cümleniz hakkında bazı açıklamalar için minnettar olurum.
cameraOrientation
, framePitch
ve frameYaw
hepsi kuaterniyonlardır (her bir kuaterniyon 4 şamandıra veya iki kattır ).
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.
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.
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);