Bagikan melalui


SceneKit di Xamarin.iOS

SceneKit adalah API grafik adegan 3D yang menyederhanakan bekerja dengan grafik 3D. Ini pertama kali diperkenalkan di OS X 10.8, dan sekarang telah hadir di iOS 8. Dengan SceneKit menciptakan visualisasi 3D imersif dan game 3D kasual tidak memerlukan keahlian dalam OpenGL. Membangun konsep grafik adegan umum, SceneKit mengabstraksi kompleksitas OpenGL dan OpenGL ES, sehingga sangat mudah untuk menambahkan konten 3D ke aplikasi. Namun, jika Anda seorang ahli OpenGL, SceneKit memiliki dukungan besar untuk mengikat langsung dengan OpenGL juga. Ini juga mencakup banyak fitur yang melengkapi grafis 3D, seperti fisika, dan terintegrasi dengan sangat baik dengan beberapa kerangka kerja Apple lainnya, seperti Core Animation, Core Image dan Sprite Kit.

SceneKit sangat mudah untuk dikerjakan. Ini adalah API deklaratif yang mengurus penyajian. Anda cukup menyiapkan adegan, menambahkan properti ke dalamnya, dan SceneKit menangani penyajian adegan.

Untuk bekerja dengan SceneKit, Anda membuat grafik adegan menggunakan SCNScene kelas . Adegan berisi hierarki simpul, yang diwakili oleh instans SCNNode, menentukan lokasi dalam ruang 3D. Setiap simpul memiliki properti seperti geometri, pencahayaan, dan bahan yang memengaruhi penampilannya, seperti yang diilustrasikan oleh gambar berikut:

The SceneKit hierarchy

Membuat Adegan

Untuk membuat adegan muncul di layar, Anda menambahkannya ke layar SCNView dengan menetapkannya ke properti Adegan tampilan. Selain itu, jika Anda membuat perubahan pada adegan, SCNView akan memperbarui dirinya sendiri untuk menampilkan perubahan.

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

Adegan dapat diisi dari file yang diekspor melalui alat pemodelan 3d, atau secara terprogram dari primitif geometris. Misalnya, ini adalah cara membuat bola dan menambahkannya ke adegan:

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

Menambahkan Cahaya

Pada titik ini bola tidak akan menampilkan apa pun karena tidak ada cahaya di adegan. Melampirkan SCNLight instans ke simpul membuat lampu di SceneKit. Ada beberapa jenis lampu mulai dari berbagai bentuk pencahayaan arah hingga pencahayaan sekitar. Misalnya kode berikut membuat cahaya omnidirectional di sisi bola:

// 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);

Pencahayaan omnidirectional menghasilkan pantulan difus yang menghasilkan pencahayaan yang merata, seperti bersinar senter. Menciptakan cahaya sekitar mirip, meskipun tidak memiliki arah karena bersinar sama di semua arah. Anggap saja seperti pencahayaan suasana hati :)

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

Dengan lampu di tempat, bola sekarang terlihat di tempat kejadian.

The sphere is visible in the scene when lit

Menambahkan Kamera

Menambahkan kamera (SCN Kamera) ke adegan mengubah sudut pandang. Pola untuk menambahkan kamera serupa. Buat kamera, lampirkan ke simpul dan tambahkan simpul ke adegan.

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

Seperti yang Anda lihat dari kode di atas, objek SceneKit dapat dibuat menggunakan konstruktor atau dari metode Buat pabrik. Yang pertama memungkinkan penggunaan sintaksis inisialisasi C#, tetapi mana yang akan digunakan sebagian besar masalah preferensi.

Dengan kamera di tempat, seluruh bola terlihat oleh pengguna:

The entire sphere is visible to the user

Anda juga dapat menambahkan lampu tambahan ke adegan. Berikut adalah tampilannya dengan beberapa lampu omnidirectional lainnya:

The sphere with a few more omnidirectional lights

Selain itu, dengan mengatur sceneView.AllowsCameraControl = true, pengguna dapat mengubah sudut pandang dengan gerakan sentuh.

Materi

Bahan dibuat dengan kelas SCNMaterial. Misalnya untuk menambahkan gambar ke permukaan bola, atur gambar ke konten difus materi.

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

Ini melapisi gambar ke simpul seperti yang ditunjukkan di bawah ini:

Layering the image onto the sphere

Bahan juga dapat diatur untuk merespons jenis pencahayaan lainnya. Misalnya, objek dapat dibuat mengkilap dan memiliki konten spekular yang diatur untuk menampilkan pantulan spekular, menghasilkan titik terang di permukaan, seperti yang ditunjukkan di bawah ini:

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

Bahan sangat fleksibel, memungkinkan Anda untuk mencapai banyak hal dengan kode yang sangat sedikit. Misalnya, alih-alih mengatur gambar ke konten yang difus, atur ke konten reflektif sebagai gantinya.

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

Sekarang monyet tampak duduk secara visual di dalam bola, terlepas dari sudut pandang.

Animasi

SceneKit dirancang untuk bekerja dengan baik dengan animasi. Anda dapat membuat animasi implisit atau eksplisit, dan bahkan dapat merender adegan dari pohon lapisan Animasi Inti. Saat membuat animasi implisit, SceneKit menyediakan kelas transisinya sendiri, SCNTransaction.

Berikut adalah contoh yang memutar bola:

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

Anda dapat menganimasikan lebih dari rotasi sekalipun. Banyak properti SceneKit dapat dianimasikan. Misalnya, kode berikut menganimasikan materi Shininess untuk meningkatkan pantulan spekular.

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

SceneKit sangat mudah digunakan. Ini menawarkan banyak fitur tambahan termasuk batasan, fisika, tindakan deklaratif, teks 3D, kedalaman dukungan lapangan, integrasi Sprite Kit dan integrasi Core Image hanya untuk beberapa nama.