SceneKit 命名空间
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
SceneKit 命名空间提供基于场景图的高级 3D 图形。
类
结构
SCNMatrix4 |
4x4 矩阵。 |
SCNQuaternion |
表示四元数,并包含对其操作的方法。 |
SCNVector3 |
一个 3 分量的向量。 |
SCNVector4 |
一个 4 分量的向量。 |
接口
枚举
委托
注解
场景工具包是基于分层场景图的 3D 图形框架。
场景工具包中的基本类是 SCNScene(保存所有内容)和 T:CoreGraphics.SceneKit.SCNView( UIView 呈现 SCNScene)。
具有 SCNSceneRootNode 类型的 SCNNode属性。 SCNNode的 具有 P:SceneKit.SCNNode.ChildNode并实现 System.Collections.Generic.IEnumerable`1<class MonoTouch.SceneKit.SCNNode>
。 SCNNode的属性包括 Camera、类型 SCNCamera、Geometry、类型SCNGeometry和 Light类型的 SCNLight。
此外,每个都有SCNNode一个Position属性,该属性定义空间中相对于 SCNNode'和 P:SceneKit.SCNNode.FirstMaterial 和 P:SceneKit.SCNNode.MaterialsSCNNode创建其外观ParentNode的位置。
以下示例演示了一个最小场景工具包视图:
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);
}
Geometry
SceneKit 中的所有几何图形都由 的 SCNGeometry子类描述:
SCNCapsule | 带可调端盖的药丸形胶囊 | |
SCNCone | 可截断顶部的圆锥 | |
SCNBox | 矩形框。 | |
SCNCylinder | 一个柱形。 | |
SCNFloor | 一个无限平面,能够反映其上方的几何图形。 | |
SCNPlane | 单面矩形。 | |
SCNPyramid | 四面体。 | |
SCNShape | 已延伸到第三个维度的 2D 形状。 | |
SCNSphere | 一个球。 | |
SCNText | 延伸文本。 | |
SCNTorus | 圆环形状。 | |
SCNTube | 未盖面的柱面。 |
此外,SceneKit 可以从 加载整个场景。使用 方法的 FromFile DAE 文件。
最后,开发人员可以使用 M:SceneKit.SCNGeometryElement[]* (SceneKit.SCNGeometrySource[]、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 });