Поделиться через


SceneKit в Xamarin.iOS

SceneKit — это API графа трехмерных сцен, упрощающий работу с трехмерной графикой. Он был впервые представлен в OS X 10.8 и теперь пришел в iOS 8. При использовании SceneKit создание иммерсивных трехмерных визуализаций и случайных трехмерных игр не требует опыта в OpenGL. Опираясь на общие понятия графа сцены, SceneKit абстрагирует сложности OpenGL и OpenGL ES, что упрощает добавление трехмерного содержимого в приложение. Однако если вы являетесь экспертом OpenGL, SceneKit имеет большую поддержку связывания напрямую с OpenGL, а также. Он также включает в себя множество функций, которые дополняют трехмерную графику, такие как физика, и интегрируются очень хорошо с несколькими другими платформами Apple, такими как Core Animation, Core Image и Sprite Kit.

SceneKit очень легко работать с. Это декларативный API, который заботится о отрисовке. Вы просто настроили сцену, добавьте в нее свойства, и SceneKit обрабатывает отрисовку сцены.

Для работы с SceneKit вы создаете граф сцены с помощью SCNScene класса. Сцена содержит иерархию узлов, представленных экземплярами SCNNode, определяющими расположения в трехмерном пространстве. Каждый узел имеет такие свойства, как геометрия, освещение и материалы, влияющие на его внешний вид, как показано на следующем рисунке:

The SceneKit hierarchy

Создание сцены

Чтобы создать сцену на экране, добавьте ее в объект SCNView , назначив его свойству сцены представления. Кроме того, при внесении изменений в сцену SCNView обновится для отображения изменений.

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

Сцены можно заполнять из файлов, экспортированных с помощью трехмерного средства моделирования, или программным способом из геометрических примитивов. Например, вот как создать сферу и добавить ее в сцену:

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

Добавление света

На этом этапе сфера не будет отображать ничего, потому что в сцене нет света. Присоединение SCNLight экземпляров к узлам создает свет в SceneKit. Существует несколько типов огней, начиная от различных форм направления освещения до внешнего освещения. Например, следующий код создает всенаправленный свет на стороне сферы:

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

Всенаправленное освещение создает диффузное отражение, что приводит к даже освещению, как сияние фонариком. Создание окружающего света похоже, хотя оно не имеет направления, так как она сияет одинаково во всех направлениях. Подумайте об этом, как освещение настроения :)

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

С огнем на месте, сфера теперь видна на сцене.

The sphere is visible in the scene when lit

Добавление Камера

Добавление камеры (SCN Камера) в сцену изменяет точку зрения. Шаблон для добавления камеры аналогичен. Создайте камеру, подключите ее к узлу и добавьте узел в сцену.

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

Как видно из приведенного выше кода, объекты SceneKit можно создавать с помощью конструкторов или из метода Создания фабрики. Бывший позволяет использовать синтаксис инициализатора C#, но какой из них используется, в основном является вопросом предпочтения.

С помощью камеры весь шар виден пользователю:

The entire sphere is visible to the user

Вы также можете добавить в сцену дополнительные световые индикаторы. Вот как это выглядит с несколькими еще несколькими всенаправленными светами:

The sphere with a few more omnidirectional lights

Кроме того, задав параметр sceneView.AllowsCameraControl = true, пользователь может изменить точку зрения с помощью сенсорного жеста.

Материалы

Материалы создаются с помощью класса SCNMaterial. Например, чтобы добавить изображение на поверхность сферы, задайте для изображения диффузное содержимое материала.

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

Этот слой изображения на узле, как показано ниже:

Layering the image onto the sphere

Материал можно задать для реагирования на другие типы освещения. Например, объект может быть блестящим и иметь его зриемое содержимое для отображения зеркального отражения, в результате чего яркое пятно на поверхности, как показано ниже:

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

Материалы очень гибкие, что позволяет достичь большого объема с очень небольшим кодом. Например, вместо настройки изображения диффузного содержимого задайте вместо него отражающее содержимое.

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

Теперь обезьяна, как представляется, визуально сидит в сфере, независимо от точки зрения.

Анимация

SceneKit предназначен для хорошой работы с анимацией. Вы можете создавать как неявные, так и явные анимации, и даже отображать сцену из дерева основного слоя анимации. При создании неявной анимации СценаKit предоставляет собственный класс перехода. SCNTransaction

Ниже приведен пример поворота сферы:

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

Вы можете анимировать гораздо больше, чем поворот хотя. Многие свойства SceneKit являются анимируемыми. Например, следующий код анимирует материал Shininess для увеличения спектрированного отражения.

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

SceneKit очень просто использовать. Он предлагает множество дополнительных функций, включая ограничения, физику, декларативные действия, трехмерный текст, глубину поддержки полей, интеграцию с набором sprite и интеграцию Core Image, чтобы назвать лишь несколько.