次の方法で共有


Xamarin.iOS の SceneKit

SceneKit は、3D グラフィックスの操作を簡略化する 3D シーン グラフ API です。 OS X 10.8 で初めて導入され、現在は iOS 8 にも導入されています。 SceneKit を使用すると、イマーシブな 3D 視覚化やカジュアルな 3D ゲームを作成するために OpenGL の専門知識は必要ありません。 SceneKit は、一般的なシーン グラフの概念に基づいて構築されており、OpenGL と OpenGL ES の複雑さを取り除き、3D コンテンツをアプリケーションに非常に簡単に追加できます。 その一方で、OpenGL 専門家にとって、SceneKit は OpenGL と直接連携するための優れたサポートを提供する API でもあります。 また、物理学などの 3D グラフィックスを補完し、Core Animation、Core Image、Sprite Kit など、他の複数の Apple フレームワークと非常にうまく統合できる多数の機能も含まれています。

SceneKit は非常に簡単に操作できます。 これは、レンダリングを処理する宣言型 API です。 シーンを設定し、それにプロパティを追加するだけで、SceneKit によってシーンのレンダリングが処理されます。

SceneKit を操作するには、SCNScene クラスを使用してシーン グラフを作成します。 シーンには、3D 空間内の場所を定義する、SCNNode のインスタンスによって表される、ノードの階層が含まれます。 次の図に示すように、各ノードには、外観に影響を与えるジオメトリ、ライト、素材などのプロパティがあります。

The SceneKit hierarchy

シーンの作成

シーンを画面に表示するには、シーンをビューの Scene プロパティに割り当てることでシーンを SCNView に追加します。 また、シーンに変更を加える場合、SCNView は変更を表示するためにそれ自体を更新します。

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

シーンは、3D モデリング ツールを使用してエクスポートされたファイルから、またはプログラムによってジオメトリ プリミティブから設定できます。 たとえば、球を作成してシーンに追加する方法を次に示します。

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

カメラの追加

カメラ (SCNCamera) をシーンに追加すると、視点が変わります。 カメラを追加するパターンは似ています。 カメラを作成し、カメラをノードにアタッチし、ノードをシーンに追加します。

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

上のコードからわかるように、SceneKit オブジェクトは、コンストラクターを使用して、または Create ファクトリ メソッドから作成できます。 前者の場合、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 は、アニメーションを使用して適切に動作するように設計されています。 暗黙的なアニメーションと明示的なアニメーションの両方を作成でき、コア アニメーション レイヤー ツリーからシーンをレンダリングすることもできます。 暗黙的なアニメーションを作成する場合、SceneKit には独自の遷移クラス 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 は非常に簡単に使用できます。 制約、物理、宣言型アクション、3D テキスト、被写界深度サポート、Sprite Kit 統合、Core Image 統合など、さまざまな追加機能が用意されていますが、これらはほんの一例です。