Xamarin.iOS에서 SceneKitSceneKit in Xamarin.iOS

SceneKit 3D 장면 그래프 API 3D 그래픽 작업을 간소화 하는 경우SceneKit is a 3D scene graph API that simplifies working with 3D graphics. OS X 10.8에 처음 도입 하 고 iOS 8 하기 위해 이제 왔습니다.It was first introduced in OS X 10.8, and has now come to iOS 8. SceneKit를 사용 하 여 몰입 감이 뛰어난 3D 시각화 및 아마추어 3D 게임을 만들기는 OpenGL에 대 한 전문이 필요 하지 않습니다.With SceneKit creating immersive 3D visualizations and casual 3D games does not require expertise in OpenGL. 일반적인 장면 그래프 개념을 토대로 SceneKit 추상화 OpenGL 및 OpenGL ES를 매우 간편 하 게 추가 3D 콘텐츠 응용 프로그램의 복잡성입니다.Building on common scene graph concepts, SceneKit abstracts away the complexities of OpenGL and OpenGL ES, making it very easy to add 3D content to an application. 그러나 OpenGL 전문가 라면 SceneKit는도 OpenGL을 사용 하 여 직접 시도 하는 것에 대 한 훌륭한 지원 합니다.However, if you are an OpenGL expert, SceneKit has great support for tying in directly with OpenGL as well. 또한 물리학 같은 3D 그래픽을 보완 하는 다양 한 기능을 포함 하 고 몇 가지 Apple 등 다른 프레임 워크, Core Animation, Core 이미지 및 Sprite Kit를 사용 하 여 매끄럽게 통합 되 합니다.It also includes numerous features that complement 3D graphics, such as physics, and integrates very well with several other Apple frameworks, such as Core Animation, Core Image and Sprite Kit.

SceneKit 사용 하기가 매우 쉽습니다.SceneKit is extremely easy to work with. 렌더링을 처리 하는 선언적 API입니다.It is a declarative API that takes care of rendering. 단순히를 설정 하 장면 장면의 렌더링, 그리고 SceneKit 처리 속성을 추가 합니다.You simply set up a scene, add properties to it, and SceneKit handles the rendering of the scene.

사용 하 여 장면 그래프 만든 SceneKit을 사용 하 여 SCNScene 클래스입니다.To work with SceneKit you create a scene graph using the SCNScene class. 인스턴스를 나타내는 노드 계층을 포함 하는 장면 SCNNode를 3D 공간에서 위치를 정의 합니다.A scene contains a hierarchy of nodes, represented by instances of SCNNode, defining locations in 3D space. 다음 그림에 나온 것 처럼 각 노드에 기 하 도형, 조명 등 해당 모양에 영향을 주는 자료는 속성이 있습니다.Each node has properties such as geometry, lighting and materials that affect its appearance, as illustrated by the following figure:

장면 만들기Create a Scene

화면에 표시 하는 장면 있도록에 추가 SCNView 뷰의 장면 속성에 할당 하 여 합니다.To make a scene appear on screen, you add it to an SCNView by assigning it to the view’s Scene property. 또한 장면 변경을 수행한 경우 SCNView 변경 내용을 표시 하려면 자동으로 업데이트 됩니다.Additionally, if you make any changes to the scene, SCNView will update itself to display the changes.

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

장면 3d 모델링 도구를 통해 내보낸 파일에서 또는 프로그래밍 방식으로 기하학적 기본 형식에서 채울 수 있습니다.Scenes can be populated from files exported via a 3d modeling tool, or programmatically from geometric primitives. 예를 들어, 이것이 구 만들고 장면에 추가 하는 방법입니다.For example, this is how to create a sphere and add it to the scene:

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

광원 추가Adding Light

이 시점에서 구체 장면에서 없습니다 light 있기 때문에 항목으로 표시 되지 않습니다.At this point the sphere won’t display anything because there is no light in the scene. 연결 SCNLight 인스턴스 노드를 SceneKit에서 광원을 만듭니다.Attaching SCNLight instances to nodes creates lights in SceneKit. 주변 조명 까지의 다양 한 형식의 방향성 조명은 광원의 몇 가지 종류가 있습니다.There are several types of lights ranging from various forms of directional lighting to ambient lighting. 예를 들어 다음 코드는 구체 측면의 전방향 light를 만듭니다.For example the following code creates an omnidirectional light on the side of the sphere:

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

전방향 조명을 비추는 손전등 같은 일종의 결과도 조명에 확산 반사를 생성 합니다.Omnidirectional lighting produces a diffuse reflection resulting in an even lighting, sort of like shining a flashlight. 주변 광원을 만드는 경우와 마찬가지로 하지만 방향이 없는 모든 방향에서 균등 하 게 장점을 발휘 하는 대로Creating ambient light is similar, although it has no direction as it shines equally in all directions. 생각 무드:) 조명Think of it like mood lighting :)

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

원위치에서 조명을 사용 하 여 구의 장면에 표시 됩니다.With the lights in place, the sphere is now visible in the scene.

카메라를 추가합니다.Adding a Camera

관점을 변경 (SCNCamera) 카메라 장면에 추가 합니다.Adding a camera (SCNCamera) to the scene changes the point of view. 카메라를 추가 하는 패턴이 비슷합니다.The pattern to add the camera is similar. 카메라를 만들고 노드에 연결 장면 노드를 추가 합니다.Create the camera, attach it to a node and add the node to the scene.

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

Create 팩터리 메서드 또는 생성자를 사용 하 여 개체를 만들 수 있습니다 SceneKit 위의 코드에서 볼 수 있습니다.As you can see from the code above, SceneKit objects can be created using constructors or from the Create factory method. 전자를 사용 하 여 사용 하면 C# 이니셜라이저 구문을 있지만 사용할지는 주로 기본 설정 합니다.The former allows using C# initializer syntax, but which one to use is largely a matter of preference.

위치에서 카메라를 사용 하 여 전체 구를 사용자에 게 표시 됩니다.With the camera in place, the entire sphere is visible to the user:

장면에 추가 광원을 추가할 수 있습니다.You can add additional lights to the scene as well. 모양을 몇 가지 자세한 전방향 표시등이 다음과 같습니다.Here is what it looks like with a few more omnidirectional lights:

또한 설정 하 여 sceneView.AllowsCameraControl = true, 사용자가 터치 제스처를 사용 하 여 관점을 변경할 수 있습니다.Additionally, by setting sceneView.AllowsCameraControl = true, the user can change the point of view with a touch gesture.

자료Materials

자료는 SCNMaterial 클래스를 사용 하 여 생성 됩니다.Materials are created with the SCNMaterial class. 구의 화면에 이미지를 추가 하는 예에 대 한 자료의 이미지를 설정 확산 내용입니다.For example to add an image onto the sphere’s surface, set the image to the material’s diffuse contents.

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

이 계층 아래와 같이 노드로 이미지:This layers the image onto the node as shown below:

다른 유형의 너무 조명에 응답 하는 자료를 설정할 수 있습니다.A material can be set to respond to other types of lighting too. 예를 들어 개체 shiny 수 있습니다 및 반사 내용을 설정한 반사광을 아래와 같이 화면에서 밝은 위치에 결과 표시 하려면:For example, the object can be made shiny and have its specular contents set to display specular reflection, resulting in a bright spot on the surface, as shown below:

자료는 매우 유연 하므로 매우 적은 양의 코드로 많이 얻을 수 있습니다.Materials are very flexible, allowing you to achieve a lot with very little code. 예를 들어, 확산 내용에 이미지를 설정 하는 대신 해당 내용으로 설정 반사 대신 합니다.For example, instead of setting the image to the diffuse contents, set it to the reflective contents instead.

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

이제는 monkey 구체를 관점의 독립적인 내에서 시각적으로 배치에 나타납니다.Now the monkey appears to sit visually within the sphere, independent of the point of view.

애니메이션Animation

SceneKit은 애니메이션에서 잘 작동 하도록 설계 되었습니다.SceneKit is designed to work well with animation. 암시적 또는 명시적 애니메이션을 만들 수 있습니다 하 고 핵심 애니메이션 계층 트리에서 장면 렌더링도 있습니다.You can create both implicit or explicit animations, and can even render a scene from a Core Animation layer tree. SceneKit 자체 전환 클래스를 제공 암시적 애니메이션을 만들 때 SCNTransaction합니다.When creating an implicit animation, SceneKit provides its own transition class, SCNTransaction.

구체를 회전 하는 예제는 다음과 같습니다.Here’s an example that rotates the sphere:

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

그러나 회전 보다 훨씬 더 애니메이트할 수 있습니다.You can animate much more than rotation though. SceneKit의 많은 속성은 애니메이션 효과 줄.Many properties of SceneKit are animatable. 예를 들어, 다음 코드는 애니메이션 효과 줍니다 재질의 Shininess 반사광을 늘려야 합니다.For example, the following code animates the material’s Shininess to increase the specular reflection.

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

SceneKit 매우 간단 하 게 사용 됩니다.SceneKit is very straightforward to use. 다양 한 제약 조건, 물리, 선언적 작업, 3D 텍스트, 필드 지원, Sprite Kit 통합 및 몇 가지 이름을 Core 이미지 통합의 깊이 비롯 한 추가 기능을 제공 합니다.It offers a wealth of additional features including constraints, physics, declarative actions, 3D text, depth of field support, Sprite Kit integration and Core Image integration to name just a few.