1、SCNParametricGeometry简介

  SCNParametricGeometry用于创建简单的3D模型,比如SCNPlane 平面、SCNPyramid 锥形(金字塔)、SCNBox 立方体、SCNSphere 球体、SCNCylinder 圆柱、SCNCone 圆锥体、SCNTube 圆柱管道、SCNCapsule 胶囊、SCNTorus 圆环面、SCNFloor 地板、SCNText 字体、SCNShape 自定义几何体!

2、SCNPlane 平面

  • 效果图

  • 相关代码
- (void)addPlane{
SCNPlane *plane = [SCNPlane planeWithWidth: height:];
SCNNode *geoNode = [SCNNode nodeWithGeometry:plane]; plane.firstMaterial.multiply.contents = @"pic5.ipg";
plane.firstMaterial.diffuse.contents=@"pic5.ipg";
plane.firstMaterial.multiply.intensity = 0.5;
plane.firstMaterial.lightingModelName = SCNLightingModelConstant;
geoNode.position = SCNVector3Make(, , -);
[self.scnScene.rootNode addChildNode:geoNode];
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self addFloor];
[self addLight];
}
  • 相关属性(官方图片)

//初始化
+ (instancetype)planeWithWidth:(CGFloat)width height:(CGFloat)height; //平面宽度
@property(nonatomic) CGFloat width; //平面高度
@property(nonatomic) CGFloat height; //沿X轴的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1。
@property(nonatomic) NSInteger widthSegmentCount; //沿Y轴的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1。
@property(nonatomic) NSInteger heightSegmentCount; //平面圆角半径
@property(nonatomic) CGFloat cornerRadius API_AVAILABLE(macos(10.9)); //圆角的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值是10。
@property(nonatomic) NSInteger cornerSegmentCount API_AVAILABLE(macos(10.9));

3、SCNBox 立方体

  • 效果图

  • 相关代码
- (void)addBody{
SCNBox *box = [SCNBox boxWithWidth: height: length: chamferRadius:];
SCNNode *geoNode = [SCNNode nodeWithGeometry:box]; box.firstMaterial.multiply.contents = @"pic5.ipg";
box.firstMaterial.diffuse.contents=@"pic5.ipg";
box.firstMaterial.multiply.intensity = 0.5;
box.firstMaterial.lightingModelName = SCNLightingModelConstant;
geoNode.position = SCNVector3Make(, , -);
[self.scnScene.rootNode addChildNode:geoNode];
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self addFloor];
[self addLight];
}
  • 相关属性(官方图片)

/**
创建立方体 @param width 宽度
@param height 高度
@param length 长度
@param chamferRadius 边的圆角半径
*/
+ (instancetype)boxWithWidth:(CGFloat)width height:(CGFloat)height length:(CGFloat)length chamferRadius:(CGFloat)chamferRadius; //宽度可动画 默认1
@property(nonatomic) CGFloat width; //高度可动画 默认1
@property(nonatomic) CGFloat height; //长度可动画 默认1
@property(nonatomic) CGFloat length; //圆角半径可动画 默认0
@property(nonatomic) CGFloat chamferRadius; //沿X轴的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1。
@property(nonatomic) NSInteger widthSegmentCount; //沿Y轴的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1。
@property(nonatomic) NSInteger heightSegmentCount; //沿Z轴的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1。
@property(nonatomic) NSInteger lengthSegmentCount; //圆角的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值是5。
@property(nonatomic) NSInteger chamferSegmentCount;

4、SCNPyramid 锥形(金字塔)

  • 效果图

  • 相关代码
- (void)addPyramid{
SCNPyramid *pyramid = [SCNPyramid pyramidWithWidth: height: length:];
SCNNode *geoNode = [SCNNode nodeWithGeometry:pyramid]; pyramid.firstMaterial.multiply.contents = @"pic5.ipg";
pyramid.firstMaterial.diffuse.contents=@"pic5.ipg";
pyramid.firstMaterial.multiply.intensity = 0.5;
pyramid.firstMaterial.lightingModelName = SCNLightingModelConstant;
geoNode.position = SCNVector3Make(, , -);
[self.scnScene.rootNode addChildNode:geoNode];
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self addFloor];
[self addLight];
}
  • 相关属性(官方图片)

/**
初始化 @param width 宽度
@param height 高度
@param length 长度
*/
+ (instancetype)pyramidWithWidth:(CGFloat)width height:(CGFloat)height length:(CGFloat)length; //宽度可动画 默认1
@property(nonatomic) CGFloat width; //高度可动画 默认1
@property(nonatomic) CGFloat height; //长度可动画 默认1
@property(nonatomic) CGFloat length; //沿Z轴的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1
@property(nonatomic) NSInteger widthSegmentCount; //沿Y轴的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1
@property(nonatomic) NSInteger heightSegmentCount; //沿Z轴的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1
@property(nonatomic) NSInteger lengthSegmentCount;

5、SCNSphere 球体

  • 效果图

  • 相关代码
- (void)addSphere{
SCNSphere *sphere = [SCNSphere sphereWithRadius:];
SCNNode *geoNode = [SCNNode nodeWithGeometry:sphere]; sphere.firstMaterial.multiply.contents = @"pic5.ipg";
sphere.firstMaterial.diffuse.contents=@"pic5.ipg";
sphere.firstMaterial.multiply.intensity = 0.5;
sphere.firstMaterial.lightingModelName = SCNLightingModelConstant;
geoNode.position = SCNVector3Make(, , -);
[self.scnScene.rootNode addChildNode:geoNode];
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self addFloor];
[self addLight];
}
  • 相关属性(官方图片)

//初始化 球半径
+ (instancetype)sphereWithRadius:(CGFloat)radius; //半径
@property(nonatomic) CGFloat radius; //是否用多边形网格来渲染球体 默认NO
@property(nonatomic, getter=isGeodesic) BOOL geodesic; //沿经纬线的子划分数。可以做成动画。
//如果值小于3,则行为未定义。默认值为24
@property(nonatomic) NSInteger segmentCount;

6、SCNCylinder 圆柱

  • 效果图

  • 相关代码
- (void)addCylinder{
SCNCylinder *cylinder = [SCNCylinder cylinderWithRadius: height:];
SCNNode *geoNode = [SCNNode nodeWithGeometry:cylinder]; cylinder.firstMaterial.multiply.contents = @"pic5.ipg";
cylinder.firstMaterial.diffuse.contents=@"pic5.ipg";
cylinder.firstMaterial.multiply.intensity = 0.5;
cylinder.firstMaterial.lightingModelName = SCNLightingModelConstant;
geoNode.position = SCNVector3Make(, , -);
[self.scnScene.rootNode addChildNode:geoNode];
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self addFloor];
[self addLight];
}
  • 相关属性(官方图片)

/**
初始化 @param radius 圆柱半径
@param height 高度
*/
+ (instancetype)cylinderWithRadius:(CGFloat)radius height:(CGFloat)height; //半径
@property(nonatomic) CGFloat radius; //高度
@property(nonatomic) CGFloat height; //沿径向坐标的子划分数。可以做成动画。
//如果值小于3,则该行为是未定义的。默认值是48。
@property(nonatomic) NSInteger radialSegmentCount; //在Y轴上的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1。
@property(nonatomic) NSInteger heightSegmentCount;

7、SCNCone 圆锥体

  • 效果图

  • 相关代码
- (void)addCone{
SCNCone *cone = [SCNCone coneWithTopRadius: bottomRadius: height:];
SCNNode *geoNode = [SCNNode nodeWithGeometry:cone]; cone.firstMaterial.multiply.contents = @"pic5.ipg";
cone.firstMaterial.diffuse.contents=@"pic5.ipg";
cone.firstMaterial.multiply.intensity = 0.5;
cone.firstMaterial.lightingModelName = SCNLightingModelConstant;
geoNode.position = SCNVector3Make(, , -);
[self.scnScene.rootNode addChildNode:geoNode];
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self addFloor];
[self addLight];
}
  • 相关属性(官方图片)

/**
初始化 @param topRadius 顶部半径(顶部为0时就是圆锥)
@param bottomRadius 底部半径
@param height 高度
*/
+ (instancetype)coneWithTopRadius:(CGFloat)topRadius bottomRadius:(CGFloat)bottomRadius height:(CGFloat)height; //顶部半径可动画 默认0
@property(nonatomic) CGFloat topRadius; //底部半径可动画 默认0.5
@property(nonatomic) CGFloat bottomRadius; //高度可动画 默认1
@property(nonatomic) CGFloat height; //沿径向坐标的子划分数。可以做成动画。
//如果值小于3,则该行为是未定义的。默认值是48。
@property(nonatomic) NSInteger radialSegmentCount; //在Y轴上的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1。
@property(nonatomic) NSInteger heightSegmentCount;

8、SCNTube 圆柱管道

  • 效果图

  • 相关代码
- (void)addTube{
SCNTube *tube = [SCNTube tubeWithInnerRadius: outerRadius: height:];
SCNNode *geoNode = [SCNNode nodeWithGeometry:tube]; tube.firstMaterial.multiply.contents = @"pic5.ipg";
tube.firstMaterial.diffuse.contents=@"pic5.ipg";
tube.firstMaterial.multiply.intensity = 0.5;
tube.firstMaterial.lightingModelName = SCNLightingModelConstant;
geoNode.position = SCNVector3Make(, , -);
[self.scnScene.rootNode addChildNode:geoNode];
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:2 y:0 z: duration:]]];
[self addFloor];
[self addLight];
}
  • 相关属性(官方图片)

/**
初始化 @param innerRadius 内圆半径
@param outerRadius 外圆半径
@param height 高度
*/
+ (instancetype)tubeWithInnerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius height:(CGFloat)height; //内圆半径可动画 默认0.25
@property(nonatomic) CGFloat innerRadius; //外圆半径可动画 默认0.5
@property(nonatomic) CGFloat outerRadius; //高度可动画 默认1
@property(nonatomic) CGFloat height; //沿径向坐标的子划分数。可以做成动画。
//如果值小于3,则该行为是未定义的。默认值是48。
@property(nonatomic) NSInteger radialSegmentCount; //在Y轴上的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1。
@property(nonatomic) NSInteger heightSegmentCount;

9、SCNCapsule 胶囊

  • 效果图

  • 相关代码
- (void)addCapsule{
SCNCapsule *capsule = [SCNCapsule capsuleWithCapRadius: height:];
SCNNode *geoNode = [SCNNode nodeWithGeometry:capsule]; capsule.firstMaterial.multiply.contents = @"pic5.ipg";
capsule.firstMaterial.diffuse.contents=@"pic5.ipg";
capsule.firstMaterial.multiply.intensity = 0.5;
capsule.firstMaterial.lightingModelName = SCNLightingModelConstant;
geoNode.position = SCNVector3Make(, , -);
[self.scnScene.rootNode addChildNode:geoNode];
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self addFloor];
[self addLight];
}
  • 相关属性(官方图片)

/**
初始化 @param capRadius 球半径
@param height 高度
*/
+ (instancetype)capsuleWithCapRadius:(CGFloat)capRadius height:(CGFloat)height; //两端球半径 可动画默认0.5
@property(nonatomic) CGFloat capRadius; //高度 可动画默认2
@property(nonatomic) CGFloat height; //沿径向坐标的子划分数。可以做成动画。
//如果值小于3,则该行为是未定义的。默认值是48。
@property(nonatomic) NSInteger radialSegmentCount; //在Y轴上的子划分数。可以做成动画。
//如果值小于1,则行为未定义。默认值为1。
@property(nonatomic) NSInteger heightSegmentCount; //帽子上的子划分数。可以做成动画。
//如果值小于2,则行为未定义。默认值是24。
@property(nonatomic) NSInteger capSegmentCount;

10、SCNTorus 圆环面

  • 效果图

  • 相关代码
- (void)addToruse{
SCNTorus *torus = [SCNTorus torusWithRingRadius: pipeRadius:];
SCNNode *geoNode = [SCNNode nodeWithGeometry:torus]; torus.firstMaterial.multiply.contents = @"pic5.ipg";
torus.firstMaterial.diffuse.contents=@"pic5.ipg";
torus.firstMaterial.multiply.intensity = 0.5;
torus.firstMaterial.lightingModelName = SCNLightingModelConstant;
geoNode.position = SCNVector3Make(, , -);
[self.scnScene.rootNode addChildNode:geoNode];
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self addFloor];
[self addLight];
}
  • 相关属性(官方图片)

/**
初始化 @param ringRadius 圆环外半径
@param pipeRadius 圆环半径
*/
+ (instancetype)torusWithRingRadius:(CGFloat)ringRadius pipeRadius:(CGFloat)pipeRadius; //圆环外半径 可动画默认0.5
@property(nonatomic) CGFloat ringRadius; //圆环半径 可动画默认0.25
@property(nonatomic) CGFloat pipeRadius; //环的子划分数。可以做成动画。
//如果值小于3,则该行为是未定义的。默认值是48。
@property(nonatomic) NSInteger ringSegmentCount; //管子的子划分数。可以做成动画。
//如果值小于3,则该行为是未定义的。默认值是24。
@property(nonatomic) NSInteger pipeSegmentCount;

11、SCNFloor 地板

  • 效果图(下面红色就是地板)

  • 相关代码
- (void)addFloor{
SCNNode *node = [SCNNode node];
node.geometry = ({
SCNFloor *floor = [SCNFloor floor];
floor.firstMaterial.diffuse.contents = [UIImage imageNamed:@"sun.jpg"];
floor;
});
node.position = SCNVector3Make(, , );
[self.scnScene.rootNode addChildNode:node];
}
  • 相关属性
//初始化
+ (instancetype)floor; //指定地板的反射率。可以做成动画。
//如果值大于零,则表面将反映场景中的其他对象。默认值为0.25。
@property(nonatomic) CGFloat reflectivity; //指定从地板开始下降的距离。可以做成动画。默认值为0。
@property(nonatomic) CGFloat reflectionFalloffStart; //指定从地板上的跌落结束的距离。可以做成动画。
//如果值为0,则没有衰减。默认值为0。
@property(nonatomic) CGFloat reflectionFalloffEnd; //确定要反射的节点类别
@property(nonatomic) NSUInteger reflectionCategoryBitMask API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0)); //在X轴上的地板范围。可以做成动画。
//如果值等于0,那么在X轴上的地板是无限的。默认值为0。
@property(nonatomic) CGFloat width API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0)); //在Z轴上的地板范围。可以做成动画。
//如果值为0,那么在Z轴上的地板是无限的。默认值为0。
@property(nonatomic) CGFloat length API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0)); //指定用于呈现反射的缓冲区的分辨率比例因子。默认0.5
@property(nonatomic) CGFloat reflectionResolutionScaleFactor API_AVAILABLE(macos(10.10));

12、SCNText 字体

  • 效果图

  • 相关代码
- (void)addText{
SCNText *text = [SCNText textWithString:@"你好" extrusionDepth:];
text.font = [UIFont systemFontOfSize:];
text.alignmentMode = kCAAlignmentCenter;
SCNNode *geoNode = [SCNNode nodeWithGeometry:text]; text.firstMaterial.multiply.contents = @"pic5.ipg";
text.firstMaterial.diffuse.contents=@"pic5.ipg";
text.firstMaterial.multiply.intensity = 0.5;
text.firstMaterial.lightingModelName = SCNLightingModelConstant;
geoNode.position = SCNVector3Make(-, , -);
[self.scnScene.rootNode addChildNode:geoNode];
[self addFloor];
[self addLight];
}
  • 相关属性(官方图片)

/**
创建3D文字 @param string 文本
@param extrusionDepth 挤压深度
*/
+ (instancetype)textWithString:(nullable id)string extrusionDepth:(CGFloat)extrusionDepth; //挤压深度 可动画如果值为0就是单面2D版本
@property(nonatomic) CGFloat extrusionDepth; //文本必须是NSString或NSAttributedString的实例。
@property(nonatomic, copy, nullable) id string; //字体属性大小 默认值是Helvetica size 36。
@property(nonatomic, retain, null_resettable) UIFont *font; //文本是否被包装,要包装的文本,首先需要设置它的边界,否则文本不会被包装。默认值是NO。
@property(nonatomic, getter=isWrapped) BOOL wrapped; //设置文本包装
@property(nonatomic) CGRect containerFrame; //截断文本以适应边界 枚举默认值kCATruncationNone,具体参考CATextLayer.h
@property(nonatomic, copy) NSString *truncationMode; //设置文本对齐方式
@property(nonatomic, copy) NSString *alignmentMode;
CA_EXTERN NSString * const kCAAlignmentNatural
CA_AVAILABLE_STARTING (10.5, 3.2, 9.0, 2.0);
CA_EXTERN NSString * const kCAAlignmentLeft
CA_AVAILABLE_STARTING (10.5, 3.2, 9.0, 2.0);
CA_EXTERN NSString * const kCAAlignmentRight
CA_AVAILABLE_STARTING (10.5, 3.2, 9.0, 2.0);
CA_EXTERN NSString * const kCAAlignmentCenter
CA_AVAILABLE_STARTING (10.5, 3.2, 9.0, 2.0);
CA_EXTERN NSString * const kCAAlignmentJustified
CA_AVAILABLE_STARTING (10.5, 3.2, 9.0, 2.0); //每个倒棱边的宽度或深度。可以做成动画。可以做成动画。
//值范围[0,挤压深度/ 2]。实际的倒角半径可能与此处指定的倒角不同:大的值被剪切到每个字符的最大值。默认值为0。
@property(nonatomic) CGFloat chamferRadius; //确定每个倒棱边的横截面轮廓的路径。
@property(nonatomic, copy, nullable) UIBezierPath *chamferProfile; //指定显示字体平滑度
//更小的数字会使曲线更平滑,而在顶点上的计算和更重的几何图形的代价更大。默认值是1.0,它会产生平滑的曲线。
@property(nonatomic) CGFloat flatness API_AVAILABLE(macos(10.9));

13、SCNShape 自定义几何体

  • 效果图 

  • 相关代码 
- (void)addPath{
UIBezierPath *path=[UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(, )];
[path addLineToPoint:CGPointMake(, )];
[path addLineToPoint:CGPointMake(, )]; [path addArcWithCenter:CGPointMake(2.5, ) radius:2.5 startAngle: endAngle:M_PI clockwise:YES];
[path addArcWithCenter:CGPointMake(-2.5, ) radius:2.5 startAngle: endAngle:M_PI clockwise:YES];
[path addLineToPoint:CGPointMake(-, )];
[path closePath]; //添加路径
SCNShape *Cylinder = [SCNShape shapeWithPath:path extrusionDepth:];
Cylinder.chamferMode =SCNChamferModeBoth;
Cylinder.firstMaterial.diffuse.contents =[UIImage imageNamed:@"pic5.ipg"];
SCNNode *geoNode = [SCNNode nodeWithGeometry:Cylinder];
geoNode.position = SCNVector3Make(, , -);
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self.scnScene.rootNode addChildNode:geoNode];
[self addFloor];
[self addLight];
}
  • 相关属性
//创建并返回给定形状与给定的挤压深度的3D模型
+ (instancetype)shapeWithPath:(nullable UIBezierPath *)path extrusionDepth:(CGFloat)extrusionDepth; //定义要呈现的形状的路径。
@property(nonatomic, copy, nullable) UIBezierPath *path; //挤压深度。可以做成动画。
//如果值为0,我们得到一个单面的2D版本的形状。
@property(nonatomic) CGFloat extrusionDepth; //文本的侧边被倒角。默认值是SCNChamferModeBoth。
@property(nonatomic) SCNChamferMode chamferMode;
typedef NS_ENUM(NSInteger, SCNChamferMode) {
SCNChamferModeBoth,
SCNChamferModeFront,
SCNChamferModeBack
} API_AVAILABLE(macos(10.9)); //倒角半径。可以做成动画。值被夹紧到范围[0,挤压深度/ 2]。默认值为0。
@property(nonatomic) CGFloat chamferRadius; //描述在“chamferRadius”不是nil时使用的概要文件。当“chamferProfile”为nil时,我们将返回表示象限的路径。
//概要文件应该是一个2D曲线,从(0,1)开始,到(1,0)结束。“平整度”属性也用来使这条路径变平。默认值为nil。
@property(nonatomic, copy, nullable) UIBezierPath *chamferProfile;

14、其它相关代码

  • 灯光
- (void)addLight{
SCNLight *light = [SCNLight light];
light.type = SCNLightTypeOmni;
light.color = [UIColor whiteColor];
self.scnNode.light = light;
}
  • 场景
- (SCNScene *)scnScene{
if (!_scnScene) {
_scnScene = [SCNScene scene];
_scnScene.background.contents = @"Assets.xcassets/pic5.png";
_scnScene.physicsWorld.gravity = SCNVector3Make(, -, );
}
return _scnScene;
}
  • 根节点
- (SCNNode *)scnNode{
if (!_scnNode) {
_scnNode = [[SCNNode alloc] init];
_scnNode.camera = [[SCNCamera alloc] init];
_scnNode.camera.zFar = .f;
_scnNode.camera.zNear = .1f;
// _scnNode.camera.projectionDirection = SCNCameraProjectionDirectionHorizontal;
_scnNode.position = SCNVector3Make(, , );
}
return _scnNode;
}
  • 视图view
- (SCNView *)scnView{
if (!_scnView) {
_scnView = [[SCNView alloc] initWithFrame:self.view.bounds options:@{SCNViewOptionPreferLowPowerDevice:@"MTLDevice"}];
_scnView.showsStatistics = YES;
_scnView.autoenablesDefaultLighting = YES;
[self.view addSubview:_scnView];
_scnView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_scnView]-0-|" options: metrics:nil views:NSDictionaryOfVariableBindings(_scnView)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_scnView]-0-|" options: metrics:nil views:NSDictionaryOfVariableBindings(_scnView)]];
}
return _scnView;
}
  • 例子
- (void)viewDidLoad
{
[super viewDidLoad];
self.scnView.scene = self.scnScene;
[self.scnScene.rootNode addChildNode:self.scnNode];
[self addPath];
}
- (void)addPath{
UIBezierPath *path=[UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(, )];
[path addLineToPoint:CGPointMake(, )];
[path addLineToPoint:CGPointMake(, )]; [path addArcWithCenter:CGPointMake(2.5, ) radius:2.5 startAngle: endAngle:M_PI clockwise:YES];
[path addArcWithCenter:CGPointMake(-2.5, ) radius:2.5 startAngle: endAngle:M_PI clockwise:YES];
[path addLineToPoint:CGPointMake(-, )];
[path closePath]; //添加路径
SCNShape *Cylinder = [SCNShape shapeWithPath:path extrusionDepth:];
Cylinder.chamferMode =SCNChamferModeBoth;
Cylinder.firstMaterial.diffuse.contents =[UIImage imageNamed:@"pic5.ipg"];
SCNNode *geoNode = [SCNNode nodeWithGeometry:Cylinder];
geoNode.position = SCNVector3Make(, , -);
[geoNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self.scnScene.rootNode addChildNode:geoNode];
[self addFloor];
[self addLight];
}

iOS开发之SceneKit框架--SCNParametricGeometry.h的更多相关文章

  1. iOS开发之SceneKit框架--SCNNode.h

    1.SCNNode简介 SCNNode是场景图的结构元素,表示3D坐标空间中的位置和变换,您可以将模型,灯光,相机或其他可显示内容附加到该元素.也可以对其做动画. 2.相关API简介 初始化方法 // ...

  2. iOS开发之SceneKit框架--SCNAction.h

    1.SCNAction简介 主要负责节点SCNNode的属性,实现node的渐变.移动.出现.消失.实现动画等. 2.相关API 节点的移动(earthNode的初始坐标(5,0,0)) //从当前位 ...

  3. iOS开发之SceneKit框架--SCNLight.h

    1.SCNLight简介 用于添加光源,连接到一个节点照亮现场,可以给场景添加不同的灯光,模拟逼真的环境. 2.四种灯光的简介 添加一个box立方体.一个tube圆柱管道和一个地板floor,没有灯光 ...

  4. iOS开发之SceneKit框架--SCNCamera.h

    1.SCNCamera简介 被称为照相机或者摄像机,可以附加到节点以提供显示场景的角度.其实就是用户视角和人的眼睛一样. 2.相关API简介 初始化 //懒加载 + (instancetype)cam ...

  5. iOS开发之SceneKit框架--SCNGeometry.h

    1.SCNGeometry简介 SCNGeometry负责呈现三维模型的类,它管理者物体的形状.纹理等.它可以由SCNGeometrySource和SCNGeometryElement来构造, 一个S ...

  6. iOS开发之SceneKit框架--SCNScene.h

    1.SCNScene SCNScene是一个场景图——具有附加几何形状.光照.摄像机和其他属性的节点的层次结构,共同形成可显示的3D场景. 2.相关API简介 初始化方法 //懒加载 + (insta ...

  7. iOS开发之SceneKit框架--SCNView.h

    1.SCNView 在macOS中,SCNView是NSView的子类,在iOS和tvOS中,SCNView是UIView的子类.SCNView用于显示SceneKit的3D场景,而需要设置场景的相关 ...

  8. iOS开发之SceneKit框架--加载多个模型.dae/.scn文件

    1.通过SCNGeometry或子类SCNParametricGeometry创建 相关链接:iOS开发之SceneKit框架--SCNGeometry.h iOS开发之SceneKit框架--SCN ...

  9. iOS开发之SceneKit框架--实战地月系统围绕太阳旋转

    1.创建地月太阳系统scn文件 注意:moon在earth结构下,earth和moon在sun结构下. 2.获取scn中模型的对应节点和自转(太阳为例) 获取节点: name是对应的Identity字 ...

随机推荐

  1. ubuntu 16.04 pecl 不能安裝 mcrypt

    vagrant@ubuntu-xenial:/etc/apt$ sudo pecl install mcrypt-1.0.1 downloading mcrypt-1.0.1.tgz ... Star ...

  2. git基础1

    git:     团队协作开发     版本管理      创建项目的文档     初始化   编写项目   把文件add到git仓库,其实是放到了git的代码暂存区   工作区有一个隐藏目录 .gi ...

  3. python基础第9章 魔法方法、属性和迭代器(一)

    __getitem__和__setitem__: 这个方法返回与指定键想关联的值.对序列来说,键应该是0~n-1的整数,其中n为序列的长度.对映射来说,键可以是任何类型. class A : __ge ...

  4. javascript追加节点

    追加节点 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  5. nextJS使用注意事项

    项目参考 nextJs-yicha 1. 采用方案 create-next-app.antd (1)安装 npx create-next-app --example with-ant-design m ...

  6. $My$ $template$(持续更新)

    树链剖分:(来源:树的统计) #include<bits/stdc++.h> #define rint register int using namespace std; inline v ...

  7. linux环境下创建domain

    首先进入weblogic的安装目录,具体如下: cd /wls/Oracle/Middleware/Oracle_Home/wlserver/common/bin 图形化创建 1.下载xmanager ...

  8. ZK4字命令

    zookeeper4字命令:两种方式,1.通过telnet链接服务器,执行stat.2.echo stat|nc xxx.xxx.xxx.xxx 2181效果是一样的conf:zk服务器运行时的基本信 ...

  9. Python 数据结构_队列

    目录 目录 队列 队列 Queue 队列是一种先进先出(FIFO)的数据类型, 新的元素通过 入队 的方式添加进 Queue 的末尾, 出队 就是从 Queue 的头部删除元素. 用列表来做 Queu ...

  10. 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...