SceneKit 命名空間
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
SceneKit 命名空間提供高階的場景圖形型 3D 圖形。
類別
結構
SCNMatrix4 |
4x4 矩陣。 |
SCNQuaternion |
表示四元數,並包含在其上運作的方法。 |
SCNVector3 |
3 元件向量。 |
SCNVector4 |
4 元件向量。 |
介面
列舉
委派
備註
Scene Kit 是以階層式場景圖形為基礎的 3D 圖形架構。
Scene Kit 中的基本類別是 SCNScene ,其中包含所有內容,以及,這是 UIView 轉譯 的 SCNScene 。
SCNScene具有 RootNode 類型的 SCNNode 屬性。 SCNNode的 P P:SceneKit.SCNNode.ChildNodes 並實作 System.Collections.Generic.IEnumerable`1<class MonoTouch.SceneKit.SCNNode>
。 SCNNode的屬性包括 Camera 、類型 、 Geometry 、型 SCNCameraSCNGeometry 別和 Light 類型的 SCNLight 。
此外,每個 SCNNode 屬性都會 Position 定義空間中相對於 SCNNode 's ParentNode 和和SCNNode 的位置。
下列範例顯示最小的場景套件檢視:
public MySceneView (RectangleF frame) : base(frame)
{
BackgroundColor = UIColor.Blue;
this.Scene = new SCNScene ();
var material = new SCNMaterial ();
material.Diffuse.Contents = UIImage.FromFile("textureX.png");
material.Specular.Contents = UIColor.Gray;
material.LocksAmbientWithDiffuse = true;
Scene.RootNode.Geometry = new SCNBox {
Width = 1,
Height = 1,
Length = 1,
ChamferRadius = 0.2f,
FirstMaterial = material
};
Scene.RootNode.Light = new SCNLight {
LightType = SCNLightType.Ambient,
Color = UIColor.Gray,
};
var camera = new SCNCamera ();
var cameraNode = new SCNNode () {
Camera = camera,
Position = new SCNVector3 (3, 3, 3),
Constraints = new SCNConstraint[] { SCNLookAtConstraint.Create(Scene.RootNode) }
};
Scene.RootNode.AddChildNode (cameraNode);
}
幾何形狀
SceneKit 中的所有幾何都會由 的 SCNGeometry 子類別描述:
SCNCapsule | 具有可調整尾端上限的植物形狀的密封 | |
SCNCone | 可截斷頂端的圓錐 | |
SCNBox | 矩形方塊。 | |
SCNCylinder | 直條圖。 | |
SCNFloor | 無限平面,能夠反映其上方的幾何。 | |
SCNPlane | 單面矩形。 | |
SCNPyramid | 一個子。 | |
SCNShape | 立體化成第三個維度的 2D 圖形。 | |
SCNSphere | 球。 | |
SCNText | 立體文字。 | |
SCNTorus | 環圈圖案。 | |
SCNTube | 未套用的圓柱。 |
此外,SceneKit 可以從 載入整個場景。使用 方法的 FromFile DAE 檔案。
最後,開發人員可以使用 []、SceneKit.SCNGeometryElement[]*方法,以及適當 SCNGeometrySource 和 SCNGeometryElement 物件的陣列。 以下顯示建立自訂金字塔圖:
//Lower-left
var a = new SCNVector3(-1, -1, 0);
//Upper-right
var b = new SCNVector3(1, 1, 0);
var halfX = (c.X + a.X) / 2;
var halfY = (c.Y + a.Y) / 2;
var halfZ = (c.Z + a.Z) / 2;
var b = new SCNVector3(a.X, c.Y, halfZ);
var d = new SCNVector3(c.X, a.Y, halfZ);
//Elevate the midpoint so that it's clearly a pyramid
var midPoint = new SCNVector3(halfX, halfY, halfZ + 1.0);
//The vertices of the geometry
var locs = new [] {
a, b, c, d, midPoint
};
var locSource = SCNGeometrySource.FromVertices(locs);
//Note that this relies on the ordering of locs above
//and it defines triangles (could be triangle strips, etc.)
var indices = new [] {
//Triangles are defined counter-clockwise!
4, 1, 0,
1, 4, 2,
2, 4, 3,
3, 4, 0
};
var idxArray = new byte[indices.Length][];
for(int i = 0; i < idxArray.Length; i++)
{
idxArray[i] = BitConverter.GetBytes(indices[i]);
}
var idxData = NSData.FromArray(idxArray.SelectMany(id => id).ToArray());
//Note that this relies on indices defining triangles
var element = SCNGeometryElement.FromData(idxData, SCNGeometryPrimitiveType.Triangles, indices.Length / 3, sizeof(int));
//Normals are relative to geometry
var normals = new [] {
new SCNVector3(0, 0, 1),
new SCNVector3(0, 0, 1),
new SCNVector3(0, 0, 1),
new SCNVector3(0, 0, 1),
new SCNVector3(0, 0, 1),
};;
var normSource = SCNGeometrySource.FromNormals(normals);
//These texture coords will cause the texture to wrap
var txCoords = new [] {
new CGPoint(-1, -1),
new CGPoint(-1, 1),
new CGPoint(1, 1),
new CGPoint(1, -1)
};
var txCoordsSource = SCNGeometrySource.FromTextureCoordinates(txCoords);
var geometry = SCNGeometry.Create(new [] { locSource, normSource, txCoordsSource }, new [] { element });