Aracılığıyla paylaş


Xamarin.iOS'ta SceneKit

SceneKit, 3B grafiklerle çalışmayı kolaylaştıran bir 3B sahne grafı API'sidir. İlk olarak OS X 10.8'de tanıtıldı ve şimdi iOS 8'e geldi. SceneKit, çevreleyici 3B görselleştirmeler ve gündelik 3B oyunlar oluştururken OpenGL'de uzmanlık gerektirmez. Yaygın sahne grafı kavramlarını temel alan SceneKit, OpenGL ve OpenGL ES'nin karmaşıklıklarını soyutlayarak bir uygulamaya 3B içerik eklemeyi çok kolaylaştırır. Ancak, bir OpenGL uzmanıysanız, SceneKit doğrudan OpenGL ile bağlama için de büyük desteğe sahiptir. Ayrıca fizik gibi 3B grafikleri tamamlayan ve Core Animation, Core Image ve Sprite Kit gibi diğer birçok Apple çerçevesiyle çok iyi bir şekilde tümleşen çok sayıda özellik içerir.

SceneKit ile çalışmak son derece kolaydır. İşlemeyi üstleyen bildirim temelli bir API'dir. Bir sahneyi ayarlamanız, özellikler eklemeniz yeterlidir ve SceneKit sahnenin işlenmesini işler.

SceneKit ile çalışmak için sınıfını SCNScene kullanarak bir sahne grafiği oluşturursunuz. Bir sahne, 3B alanda konumları tanımlayan örnekleriyle temsil edilen bir düğüm hiyerarşisi SCNNodeiçerir. Her düğüm, aşağıdaki şekilde gösterildiği gibi görünümünü etkileyen geometri, aydınlatma ve malzemeler gibi özelliklere sahiptir:

The SceneKit hierarchy

Sahne Oluşturma

Bir sahnenin ekranda görünmesini sağlamak için SCNView görünümün Scene özelliğine atayarak görünümüne eklersiniz. Ayrıca, sahnede herhangi bir değişiklik yaparsanız, SCNView değişiklikleri görüntülemek için kendisini güncelleştirir.

scene = SCNScene.Create ();
sceneView = new SCNView (View.Frame);
sceneView.Scene = scene;

Sahneler, 3b modelleme aracıyla dışarı aktarılan dosyalardan veya geometrik temel öğelerden program aracılığıyla doldurulabilir. Örneğin, bir kürenin nasıl oluşturulacağı ve sahnenin içine nasıl ekleneceği aşağıda verilmiştir:

sphere = SCNSphere.Create (10.0f);
sphereNode = SCNNode.FromGeometry (sphere);
sphereNode.Position = new SCNVector3 (0, 0, 0);
scene.RootNode.AddChildNode (sphereNode);

Işık Ekleme

Bu noktada küre hiçbir şey görüntülemez çünkü sahnede ışık yoktur. SCNLight Düğümlere örnek eklemek SceneKit'te ışık oluşturur. Çeşitli yönlü aydınlatma biçimlerinden ortam aydınlatmasına kadar çeşitli ışık türleri vardır. Örneğin aşağıdaki kod kürenin yanında çok yönlü bir ışık oluşturur:

// omnidirectional light
var light = SCNLight.Create ();
var lightNode = SCNNode.Create ();
light.LightType = SCNLightType.Omni;
light.Color = UIColor.Blue;
lightNode.Light = light;
lightNode.Position = new SCNVector3 (-40, 40, 60);
scene.RootNode.AddChildNode (lightNode);

Çok yönlü aydınlatma, bir el fenerinin parlaması gibi eşit bir aydınlatmaya neden olan dağınık bir yansıma üretir. Ortam ışığı oluşturmak benzerdir, ancak her yönde eşit şekilde parlamasıyla yönü yoktur. Ruh hali aydınlatması gibi düşün :)

// ambient light
ambientLight = SCNLight.Create ();
ambientLightNode = SCNNode.Create ();
ambientLight.LightType = SCNLightType.Ambient;
ambientLight.Color = UIColor.Purple;
ambientLightNode.Light = ambientLight;
scene.RootNode.AddChildNode (ambientLightNode);

Işıklar yerle bir olduğunda küre artık sahnede görünür durumdadır.

The sphere is visible in the scene when lit

Kamera ekleme

Görünüme kamera (SCN Kamera) eklemek, bakış açısını değiştirir. Kamerayı ekleme deseni benzerdir. Kamerayı oluşturun, bir düğüme ekleyin ve düğümü görünüme ekleyin.

// camera
camera = new SCNCamera {
    XFov = 80,
    YFov = 80
};
cameraNode = new SCNNode {
    Camera = camera,
    Position = new SCNVector3 (0, 0, 40)
};
scene.RootNode.AddChildNode (cameraNode);

Yukarıdaki koddan görebileceğiniz gibi, SceneKit nesneleri oluşturucular kullanılarak veya Create factory yönteminden oluşturulabilir. İlki C# başlatıcı söz diziminin kullanılmasına izin verir, ancak hangisinin kullanılacağı büyük ölçüde tercih konusudur.

Kamera yerinde olduğunda, kürenin tamamı kullanıcı tarafından görülebilir:

The entire sphere is visible to the user

Ayrıca, görünüme başka ışıklar da ekleyebilirsiniz. İşte birkaç çok yönlü ışıkla nasıl göründüğü:

The sphere with a few more omnidirectional lights

Buna ek olarak, ayarıyla sceneView.AllowsCameraControl = truekullanıcı bir dokunma hareketiyle bakış açısını değiştirebilir.

Malzemeler

Malzemeler SCNMaterial sınıfıyla oluşturulur. Örneğin kürenin yüzeyine bir görüntü eklemek için görüntüyü malzemenin yayma içeriğine ayarlayın.

material = SCNMaterial.Create ();
material.Diffuse.Contents = UIImage.FromFile ("monkey.png");
sphere.Materials = new SCNMaterial[] { material };

Bu, aşağıda gösterildiği gibi görüntüyü düğüme katmanlar:

Layering the image onto the sphere

Bir malzeme, diğer aydınlatma türlerine de yanıt verecek şekilde ayarlanabilir. Örneğin, nesne parlak hale getirilebilir ve benekli içeriği, aşağıda gösterildiği gibi yüzeyde parlak bir noktayla sonuçlanacak şekilde, belirtik yansımayı gösterecek şekilde ayarlanabilir:

The object made shiny with specular reflection, resulting in a bright spot on the surface

Malzemeler çok esnek olduğundan çok az kodla çok fazla şey başarmanızı sağlar. Örneğin, görüntüyü yayma içeriğine ayarlamak yerine yansıtıcı içerik olarak ayarlayın.

material.Reflective.Contents = UIImage.FromFile ("monkey.png");

Şimdi maymun, bakış açısından bağımsız olarak kürenin içinde görsel olarak oturuyor gibi görünüyor.

Animasyon

SceneKit, animasyonla iyi çalışacak şekilde tasarlanmıştır. Hem örtük hem de açık animasyonlar oluşturabilir ve hatta Çekirdek Animasyon katmanı ağacından bir sahne oluşturabilirsiniz. Örtük animasyon oluştururken, SceneKit kendi geçiş sınıfı SCNTransactionolan sağlar.

Küreyi döndüren bir örnek aşağıda verilmiştir:

SCNTransaction.Begin ();
SCNTransaction.AnimationDuration = 2.0;
sphereNode.Rotation = new SCNVector4 (0, 1, 0, (float)Math.PI * 4);
SCNTransaction.Commit ();

Ancak döndürmeden çok daha fazlasına animasyon ekleyebilirsiniz. SceneKit'in birçok özelliği düşünülebilir. Örneğin, aşağıdaki kod malzemeye Shininess animasyon uygulayarak belirtik yansımayı artırır.

SCNTransaction.Begin ();
SCNTransaction.AnimationDuration = 2.0;
material.Shininess = 0.1f;
SCNTransaction.Commit ();

SceneKit'in kullanımı çok basittir. Kısıtlamalar, fizik, bildirim temelli eylemler, 3B metin, alan derinliği desteği, Sprite Seti tümleştirmesi ve Çekirdek Görüntü tümleştirmesi gibi çok sayıda ek özellik sunar.