共用方式為


Xamarin.iOS 中的 SceneKit

SceneKit 是 3D 場景圖形 API,可簡化使用 3D 圖形。 它最初是在OS X 10.8中引進,現在已推出iOS 8。 使用 SceneKit 建立沉浸式 3D 視覺效果和休閒 3D 遊戲不需要 OpenGL 的專業知識。 在常見的場景圖形概念上建置,SceneKit 會抽象化 OpenGL 和 OpenGL ES 的複雜度,讓您輕鬆地將 3D 內容新增至應用程式。 不過,如果您是OpenGL專家,SceneKit也非常支援直接搭配OpenGL。 它也包含許多功能,可補充 3D 圖形,例如物理,並與數個其他 Apple 架構非常整合,例如 Core Animation、Core Image 和 Sprite Kit。

SceneKit 非常容易使用。 這是負責轉譯的宣告式 API。 您只需設定場景、將屬性新增至其中,而 SceneKit 會處理場景的呈現。

若要使用 SceneKit,您可以使用 類別建立場景圖形 SCNScene 。 場景包含節點階層,以 實例 SCNNode表示,定義 3D 空間中的位置。 每個節點都有會影響其外觀的屬性,例如幾何、光源和材質,如下圖所示:

The SceneKit hierarchy

建立場景

若要讓場景出現在畫面上,您可以將場景指派給 SCNView 檢視的 Scene 屬性,將其新增至 。 此外,如果您對場景進行任何變更, 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

新增 相機

將相機 (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 物件可以使用建構函式或從 Create Factory 方法建立。 前者允許使用 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 整合和核心映射整合,僅舉幾個名稱。