ARKit: Fizik Kuralları

ARKit ile objelerinize, gerçekte olduğu gibi fizik kuralları ekleyebilirsiniz. Böylece uygulama deneyiminizi üst seviyeye çıkarabilirsiniz!

Rana Taki
TurkishKit
7 min readMay 18, 2020

--

Merhaba TurkishKit okuyucuları🖖. Bir ARKit makalesiyle daha beraberiz! Bu makalede Apple’ın ARKit kütüphanesinde bulunan fizik kurallarını birlikte yakından inceleyeceğiz. Hiç vakit kaybetmeden başlayalım!

Fizik Kurallarını Newton Mu Keşfetti?

Fizik kuralları deyince aklınıza klasik okul fiziğiniz ve formüller gelebilir. Bazılarınız fizikten nefret ettiği için bu makaleye farklı bir gözle bakabilir (merak etmeyin, yalnız değilsiniz). Size iyi bir haberim var: Programlamadaki fizik kuralları gerçek hayattaki kadar karmaşık ve anlaşılmaz değil. Programlamadaki fizik kuralları, her gün fark ettiğiniz yerçekimi veya bir objenin belirli bir kütlesi olması gibi basit kurallardan oluşmaktadır. Örneğin, bir oyun oluştururken o oyundaki karakterlerin belirli bir kütlesi olması, çarptıklarında iç içe geçmemelerini sağlar. Bu nedenle programlamada, özellikle bir ARKit uygulamasında, fizik kuralları önemli bir yer kaplar.

SceneKit

Bu bir ARKit yazısı olmasına rağmen, ARKit kütüphanesinde sürekli kullanırız. Bunun nedeni uygulamamızı, yani sanal ortamı, bir “scene” ortamı üzerinde kurmamızdır.

“Fizik” Terimleri

Physics Body

Bir objeye bir gövde tanımlayabilmek için öncellikle bu gövdenin hangi tip olacağını seçmelisiniz. Bu tipler, yerçekiminin ve dışarıdan gelen kuvvetlerin o cismi nasıl etkilediğine bağlı tanımlanır.

Statik: Statik gövde, yerçekimi ve çarpma gibi kuvvetlerden etkilenmeyen gövde tipidir. Bu gövde tipleri genelde yer, duvar, ev ve mobilya gibi objelerde kullanılır.

Kinematik: Kinematik gövde, sadece tanımladığınız, belirli bir kuvvetten etkilenir. Mesela bir topa kinematik bir gövde tanımladığınızda, o topa hangi kuvvetin etki edeceğini de tanımlamanız gerekir. Bu örnekte, ayağınız dışında oyundaki herhangi bir obje bu topa kuvvet uyguladığında, top bu kuvvetten etkilenmez.

Dinamik: Dinamik gövde, en çok kullanacağımız gövde türüdür. Bu gövde olabilecek her kuvvetten etkilenir. Hem yerçekiminden hem de uygulamanızdaki diğer objelerin uyguladığı kuvvetten etkilenir, hareket eder.

Collision Detection

“Collision Detection” özelliği, iki tane fizik gövdesinin birbirine çarpması durumu için kullanılan özelliktir. Bu özelliği kullanabilmek için öncellikle objelerinize fizik gövdesi tanımlamanız gerekir. Bu gövdelerin birbirlerine dokunup dokunmadığını bu özellik ile anlarız.

Particle Systems

Parçacık sistemleri, parçacık animasyonlarından oluşur. Bunlara bir oyundan örnek olarak, roket havaya fırlatıldığında arkasından çıkan alevler veya biri kafasını çarptığında üstünde uçuşan yıldızlar verilebilir. Bu sistemler uygulamanızı ince detaylarla süslemek için önemlidir. Parçacık animasyonlarını ekleyerek ARKit deneyimini tam anlamıyla kullanıcınıza vermiş olursunuz.

Material

Çok bilindik bir fizik özelliği olmayan “Materials” özelliği, bir objenin rengini ve dokusunu ayarlamak için kullanılır. “Materials” kısmı tamamiyle objenin dış görünüşü ile ilgilidir.

Bir Uygulama Oluşturmak

ARKit kütüphanesinin fizik kurallarını daha yakından tanıyabilmek için basit, 3 boyutlu Angry Birds tarzı bir uygulama oluşturalım.

Bu uygulamamızda kutulardan bir kule oluşturup onu başka bir obje atarak yıkmaya çalışacağız.

Adım 1: Xcode ugulamasından bir ARKit uygulaması oluşturun. Bir önceki makalede yaptığımız gibi tüm ihtiyacınız olmayan unsurları silebilirsiniz.

Adım 2: “art.scnassets” dosyasında “Scene” ortamınıza bir “Box” objesi ekleyin ve rengini ayarlayın.

Adım 3: Objenizi seçin. Sağ üst köşede, objenizin ayarlarından çizgili ikona basın ve dinamik gövde ekleyin. Objenizin dinamik gövdesi, onun uygulanan kuvvetlerden etkilenmesini sağlar.

Adım 4: Objenizin fizik gövdesi ayarlarından “Affected by gravity” seçeneğinin seçili olduğuna emin olun. Aynı zamanda “masks” özelliklerinin aşağıdaki gibi ayarlandığına emin olun. Mask özellikleri, objenizin çarpışmaları algılaması için vardır.

Adım 5: Yine fizik gövdesi özelliklerinden en altta bulunan “Physics shapes” kısımında “Scale” seçeneğini 0.4 olarak ayarlayın. Bu, objenizin boyutunu küçültecektir. 0.4 yapmamızın sebebi “Scale” özelliğinin metre cinsinden ayar yapmasıdır.

Adım 6: “Box” objenizi copy(cmd+C)-paste(cmd+V) yaparak çoğaltın. Böylece objeleriniz, aynı özelliklere sahip olacaktır.😲

Adım 7: Objelerinizi bir kule oluşturacak şekilde dizin!

Adım 8: Objelerinizi oluşturduğunuz sanal ortamın altında bulunan “oynat” işaretine tıkladığınızda, oluşturduğunuz objelerin nasıl davranacağının bir animasyonunu görürsünüz. Şuan “oynat” düğmesine bastığımızda objelerimizin hepsinin aşağıya düştüğünü fark edeceksinizdir.😋

Bunun nedeni objelerimizin yerçekiminden etkilenmesidir. Oluşturacağımız sanal ortamda yerçekimi var, ancak yer yoktur. Bu nedenle objelerimizin altına bir destek koymamız gerekecektir.

Adım 9: Oluşturduğunuz kulenin altına bir yer eklemek için bir tane daha “box” objesi oluşturun ve boyutunu W:10 | H:0.01 | L:10 olarak ayarlayın. Eklediğiniz objeyi, oluşturduğunuz kulenin altına yerleştirin.

Adım 10: Yer objesinin fizik gövdesini statik gövdeye çevirin. “Physics shape” kısmından şu ayarlamaları yapın: Shape: Default shape| Type: Bounding Box| Scale: 100 | Collision margins: 0

Adım 11: Uygulamanızı tekrar oynatın. Kutularınızın aşağı düşmediğini ve birbirlerine çarpıp yere düştüğünü göreceksinizdir.

Adım 12: Son ayarlamalar olarak “yer” objenizin “Materials” kısmından objenizin görünmemesini sağlayabilirsiniz. “Transparent” seçeneğinden “Opacity” ayarını %0'a düşürün.

Adım 13: Ortamınıza ışık ekleyin! Ben bu noktada “directional light” ve “ambient light” ışıklarını kullandım ama ışık konusunda istediğiniz gibi davranabilirsiniz!

Tip: Eklediğiniz “directional light” objesinin “Shadow” özelliğinde “Enable shadows” kutusuna tıklarsanız, kutularınızın gölgesi yerde belirecektir. Bu, uygulamanıza gerçekçi bir özellik katar.

Adım 14: Sanal ortamımızı oluşturmayı bitirdik! Şimdi biraz da kodlayalım. Öncellikle, sanal ortamınızı gerçek dünyada uygun bir yere koyabilmek için ARKit kütüphanesinin “planeDetection” özelliğini kullanarak gerçek dünyada bir yüzey algılayalım.

Yüzey algılama hakkında daha fazla bilgi edinebilmek için bir önceki makalemize göz atabilirsiniz!

Yüzey algılayabilmek için “ViewController” sınıfımızın içine üç tane değişken tanımlayalım.

“Renderer” fonksiyonu kullanarak uygulamamızın sürekli olarak yüzey algılamasını sağlayalım.

Fonksiyonumuzun içine aşağıdaki kodu yazalım:

Bu kod, “hit test” diye bir işlem yaparak yüzeyi algılayabilmemizi sağlayacaktır ve sonradan algıladığı yüzeyi bir pozisyon vektörüne dönüştürecektir.

Adım 15: Kodlayacağımız küçük oyunu başlatabilmek için bir düğme oluşturalım. Bu düğme yerde olsun ve bastığımızda attığımız topla oluşturduğumuz kuleyi devirebilelim.

Algıladığımız yüzeye düğmemizi ekleyelim. Düğmemizin özelliklerini de aşağıdaki gibi ayarlayalım. Oyundaki diğer objelerden farklı olsun diye rengini mavi yaptım, siz yine bunu istediğiniz gibi ayarlayabilirsiniz.

Adım 16: Bir ara verebilmek için telefonunuzda şu ana kadar oluşturduğunuz uygulamayı deneyin. Uygulamanız herhangi bir yüzey algılayıp oraya tanımladığınız butonu yerleştirecektir.

Adım 17: Tanımladığımız “takip” değişkenlerinin altına ortamımızda bulunan objeleri tanımlayalım.

Adım 18: Kullanıcının uygulamayı çalıştırdığında uygulama sürekli yenilenmesin diye touchesBegan() fonksiyonu oluşturalım. Uygulama sürekli yenilenirse kule gibi objeler herhangi bir etkileşim olmasını beklemeyip sürekli yeniden oluşturulacaktır ve oyun oynanılamaz hale gelir.

Adım 19: Düğmeye bastığımızda oyunun başlaması ve kulenin yerleştirilmesi için touchesBegan() fonksiyonunun içine bir “if” fonksiyonu ekleyelim.

Adım 20: touchesBegan() fonksiyonunun içine eğer düğme bastığımızda “doğru” değerinin verdiğimiz “takip” değişkeni doğruysa, oluşturduğumuz “kule” objesini ortamımıza ekleyen bir kod yazalım.

Adım 21: ARKit kütüphanesinin havalı bir özelliği olan ortamdaki ışığı algılama özelliğini kullanma vakti geldi. Bu özellik, ortamdaki ışığı algılayıp eklediğimiz “Ambient Light” ışığını ona göre ayarlayacaktır.

Bu özelliğe erişebilmek için bir tane session oluşturmamız gerekir. viewWillAppear() fonksiyonunun içine şu kodu yazın:

Bu “session” özelliğinin kütüphanesine erişebilmemiz için “ViewController” sınıfımıza “ARSessionDelegate” ekleyelim.

Son olarak touchesBegan() fonksiyonunun altına session() fonksiyonumuzu ekleyelim. Böylece ortamdaki ışık algılanır ve “ambient light” ışığı ona göre ayarlanır.

Adım 22: Şimdi, touchesBegan() fonksiyonunun içindeki “if” ifadesinin geri kalanını kodlama vakti. Bu kısımda atacağımız topu kodlayacağız. Öncellikle, ekrana tıkladığımızda topu nereye atmamız gerektiğini tanımlayalım.

Adım 23: Topun pozisyonunu ve atılması gereken yeri tanımladığımıza göre topu oluşturalım.

Adım 24: Uygulamamız bitmiştir! Eğer uygulamanızı daha detaylandırmak istiyorsanız topunuza her çarptığında çalışacak bir “Particle System” ekleyebilirsiniz! Artık telefonunuzda deneyebilirsiniz.

Bir tane daha makalemizin sonuna geldik. Bu makalede, ARKit kütüphanesinin en önemli özelliğini, fizik kurallarını, inceledik. Bir objenin ne tip gövdeler barındırabileceğini ve nasıl davranabileceğini öğrendik. Bir sonraki makalede görüşmek üzere! İyi kodlamalar!😁

Bizi daha yakından takip etmek istiyorsanız, sosyal medya hesaplarımıza aşağıdan ulaşabilirsiniz!

Twitter | Instagram | Facebook

--

--