Udostępnij za pośrednictwem


Zestaw Sceny w środowisku Xamarin.iOS

SceneKit to interfejs API grafu sceny 3D, który upraszcza pracę z grafiką 3D. Po raz pierwszy wprowadzono go w systemie OS X 10.8 i teraz przyszedł do systemu iOS 8. Dzięki zestawowi SceneKit tworzenie immersyjnych wizualizacji 3D i zwykłych gier 3D nie wymaga wiedzy w zakresie technologii OpenGL. Opierając się na typowych pojęciach dotyczących grafu sceny, zestaw SceneKit abstrahuje od złożoności bibliotek OpenGL i OpenGL ES, co ułatwia dodawanie zawartości 3D do aplikacji. Jednak jeśli jesteś ekspertem OpenGL, SceneKit ma doskonałą obsługę wiązania bezpośrednio z OpenGL, jak również. Zawiera również wiele funkcji, które uzupełniają grafikę 3D, taką jak fizyka, i integrują się bardzo dobrze z kilkoma innymi strukturami firmy Apple, takimi jak Core Animation, Core Image i Sprite Kit.

Zestaw SceneKit jest niezwykle łatwy do pracy. Jest to deklaratywny interfejs API, który zajmuje się renderowaniem. Wystarczy skonfigurować scenę, dodać do niej właściwości, a zestaw SceneKit obsługuje renderowanie sceny.

Aby pracować z zestawem SceneKit, utworzysz graf sceny SCNScene przy użyciu klasy . Scena zawiera hierarchię węzłów reprezentowaną przez wystąpienia SCNNodeprogramu , definiując lokalizacje w przestrzeni 3D. Każdy węzeł ma właściwości, takie jak geometria, oświetlenie i materiały wpływające na jego wygląd, jak pokazano na poniższej ilustracji:

The SceneKit hierarchy

Tworzenie sceny

Aby wyświetlić scenę na ekranie, należy dodać ją do obiektu SCNView , przypisując ją do właściwości Scena widoku. Ponadto jeśli wprowadzisz jakiekolwiek zmiany w scenie, SCNView zaktualizuje się, aby wyświetlić zmiany.

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

Sceny można wypełniać z plików eksportowanych za pomocą narzędzia do modelowania 3d lub programowo z geometrycznych elementów pierwotnych. Na przykład w ten sposób można utworzyć sferę i dodać ją do sceny:

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

Dodawanie światła

W tym momencie sfera nie będzie wyświetlać niczego, ponieważ w scenie nie ma światła. Dołączanie SCNLight wystąpień do węzłów powoduje utworzenie świateł w zestawie SceneKit. Istnieje kilka rodzajów świateł, od różnych form oświetlenia kierunkowego do oświetlenia otoczenia. Na przykład poniższy kod tworzy wielokierunkowe światło po stronie sfery:

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

Oświetlenie wielokierunkowe produkuje rozproszone odbicie, co powoduje parzysłe oświetlenie, jakby świeciło latarki. Tworzenie światła otoczenia jest podobne, chociaż nie ma kierunku, ponieważ świeci równomiernie we wszystkich kierunkach. Pomyśl o tym jak oświetlenie nastroju :)

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

Gdy światła są na miejscu, sfera jest teraz widoczna w scenie.

The sphere is visible in the scene when lit

Dodawanie Aparat

Dodanie aparatu (SCN Aparat) do sceny zmienia punkt widzenia. Wzorzec dodawania aparatu jest podobny. Utwórz aparat, dołącz go do węzła i dodaj węzeł do sceny.

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

Jak widać w powyższym kodzie, obiekty SceneKit można tworzyć przy użyciu konstruktorów lub metody Create factory. Pierwsza z nich zezwala na używanie składni inicjatora języka C#, ale która z nich ma być używana, jest w dużej mierze kwestią preferencji.

Aparat jest widoczny dla użytkownika w całej sferze:

The entire sphere is visible to the user

Możesz również dodać dodatkowe światła do sceny. Oto jak wygląda z kilkoma bardziej wielokierunkowymi światłami:

The sphere with a few more omnidirectional lights

Ponadto, ustawiając sceneView.AllowsCameraControl = true, użytkownik może zmienić punkt widzenia za pomocą gestu dotykowego.

Materiały

Materiały są tworzone za pomocą klasy SCNMaterial. Aby na przykład dodać obraz do powierzchni sfery, ustaw obraz na zawartość rozproszoną materiału.

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

Ten obraz jest warstwowy na węźle, jak pokazano poniżej:

Layering the image onto the sphere

Materiał można również ustawić tak, aby reagował na inne typy oświetlenia. Na przykład obiekt może być błyszczący i mieć jego zawartość widmową ustawioną na wyświetlanie odbicia widmowego, co powoduje jasny punkt na powierzchni, jak pokazano poniżej:

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

Materiały są bardzo elastyczne, dzięki czemu można osiągnąć dużo przy bardzo małym kodzie. Na przykład zamiast ustawiać obraz na zawartość rozproszoną, ustaw go na zawartość refleksywną.

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

Teraz małpa wydaje się siedzieć wizualnie w sferze, niezależnie od punktu widzenia.

Animacja

Zestaw SceneKit został zaprojektowany tak, aby dobrze współdziałał z animacją. Można tworzyć zarówno niejawne, jak i jawne animacje, a nawet renderować scenę z drzewa warstwy Animacja podstawowa. Podczas tworzenia niejawnej animacji zestaw SceneKit udostępnia własną klasę przejścia, SCNTransaction.

Oto przykład obracający sferę:

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

Można jednak animować o wiele więcej niż rotację. Wiele właściwości zestawu SceneKit jest niezrównanych. Na przykład poniższy kod animuje materiał Shininess w celu zwiększenia odbicia widmowego.

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

Zestaw SceneKit jest bardzo prosty w użyciu. Oferuje wiele dodatkowych funkcji, w tym ograniczenia, fizykę, akcje deklaratywne, tekst 3D, głębię obsługi pól, integrację zestawu Sprite Kit i integrację obrazu podstawowego, aby wymienić tylko kilka.