Jawaban:
Anda bisa menguraikan angka empat Anda menjadi seperangkat yaw / pitch / roll, tetapi itu biasanya berlebihan.
Alih-alih menyusun angka empat Anda seperti ini:
cameraOrientation = cameraOrientation * framePitch * frameYaw;
Coba ini:
cameraOrientation = framePitch * cameraOrientation * frameYaw;
Maka tidak akan pernah menghasilkan tilt / roll dan setara dengan menyimpan yaw dan pitch secara terpisah
framePitch
dan frameYaw
float
tipe? Juga, saya akan berterima kasih atas beberapa klarifikasi pada kalimat pertama Anda.
cameraOrientation
,, framePitch
dan frameYaw
semuanya angka empat (masing-masing angka empat adalah mengapung atau ganda).
Ini adalah masalah yang saya miliki untuk sementara waktu, dan saya tidak dapat menemukan jawaban, jadi saya pikir saya akan mempostingnya di sini.
Ini sebenarnya cukup sederhana. Cara Anda paling mungkin melakukan rotasi adalah seperti ini:
currentDirection * newRotation;
Tetapi, melakukannya seperti ini juga tidak berhasil.
newRotation * currentDirection;
Yang harus Anda lakukan adalah melakukannya dengan urutan pertama untuk rotasi ke atas dan ke bawah, dan urutan kedua untuk rotasi ke samping.
Bagi saya, itu seperti ini:
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;
Untuk alasan mengapa, cara pertama memiliki rotasi relatif terhadap arah sideways saat ini, yang Anda inginkan untuk naik dan turun, tetapi Anda tidak ingin itu untuk rotasi sideways, itulah sebabnya urutan kedua diperlukan.
Untuk kamera FPS Anda biasanya tidak ingin roll dan terbatas pada +/- 90 derajat pitch, jadi saya hanya melacak keadaan saat ini menggunakan sudut yaw dan pitch. Kekuatan penuh angka empat tidak terlalu membantu untuk ini.
Anda masih dapat mengonversi sudut yaw / pitch ke dan dari angka empat jika Anda ingin beralih antara kamera FPS dan kamera animasi menggunakan interpolasi keyframe angka empat, atau sesuatu seperti itu.
Trik sederhana lainnya adalah menempatkan kamera dalam GameObject, dan memiliki rotasi Yaw untuk mengontrol objek game, sementara kamera anak dikonfigurasikan dengan koordinat Pitch:
playerCameraHolder.transform.Rotate(0, rotationYaw, 0);
playerCamera.transform.Rotate(rotationPitch, 0, 0);