Skip to content

Instantly share code, notes, and snippets.

@sem1h
Last active February 14, 2024 10:14
Show Gist options
  • Save sem1h/1671f16b9f3a560ea29711f27e92c1df to your computer and use it in GitHub Desktop.
Save sem1h/1671f16b9f3a560ea29711f27e92c1df to your computer and use it in GitHub Desktop.
Quaternion vs Euler Angles in Unity (Turkish)

Unity'de 3D çalışırken kafa kurcalayan konulardan biri Quaternion'ların ne işe yaradığı ve neden bazı yerlerde rotasyon değeri olarak Euler Angle değil de Quaternion kullanıldığıdır.

3 Boyutlu rotasyon belirtmek için kullanılan Euler Açısı, bir 3x3 rotasyon matrisi ile ifade edilebiliyor. Örnek:

Euler Açısı

İdeal bir sistemde her bir rotasyon matrisinin, yalnızca tek açıya isabet etmesini isteriz. Sorun şu ki bu matrisler, her zaman için tek açıya tekabül etmeyebiliyor. Aynı matris birden fazla açıya denk gelebiliyor.

"Gimbal Lock" sorunu oluşabiliyor. İki eksenin çakışıp bağımsızlığını yitirmesi. (Buna "Loss of degree of freedom" deniyor.) Örnek:

Gimbal Lock'a uğrayan uçak:

Gimbal Lock'a uğrayan uçak (Image by Lookang many thanks to Fu-Kwun Hwang and author of Easy Java Simulation = Francisco Esquembre - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=15837410)

Gimbal Lock teorik gösterim:

Gimbal Lock sorunu teorik gösterim (Image by Lookang many thanks to Fu-Kwun Hwang and author of Easy Java Simulation = Francisco Esquembre - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=15837410)

Bu sorunun yaşanmaması için Quaternion'lar kullanılıyor. Quaternion'larda Euler açılarına ek olarak 4. bir değer var. Bu değer skaler bir değer. Ve bunun olması, çakışmaları önlüyor.

Bir Quaternion, "a + bi + cj + dk" şeklinde gösterilebilir.

3 vektörel değerin yanındaki skaler değer sayesinde her bir rotasyon matrisi, görüntü kümesinde tek bir açıya işaret ediyor. Ve çakışma sorunu çözülmüş oluyor.

Unity'de oyun yapılırken genellikle Quaternion'ların iç yapılarıyla fazla haşır neşir olunmuyor. İnternette yaptığım araştırmalara ve nabız yoklamalara göre bunlar daha çok gelişmiş matematik ve Makine ve Uçak mühendisliğinin konuları. Yazılım camiasında daha pragmatik yaklaşılıyor ve ihtiyaç olduğu ölçüde kullanılıyor.

Mesela Quaternion.Identity(); rotasyon yok demek ya da Quaternion.lookrotation(yeniRotasyon); dediğimizde vereceğimiz yeni rotasyona dönüş sağlıyoruz.

Unity'de Quaternion ile ifade edilmiş bir rotasyonu, Euler Angle'a dönüştürebiliriz: Bunun için Quaternion.eulerAngles() metodunu çağırmamız yeterli:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public Quaternion rotation = Quaternion.identity;
    void Example() {
        rotation.eulerAngles = new Vector3(0, 30, 0);
        print(rotation.eulerAngles.y);
    }
} 

https://docs.unity3d.com/ScriptReference/Quaternion-eulerAngles.html

@CihatGMC
Copy link

Çay faydalı bir çalışma olmuş yaptğım şeyi daha iyi anladım. Teşekkürler.

@nurgulunluel
Copy link

Faydalı oldu, teşekkürlerr

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment