和風の傘を表示するiPhoneアプリのサンプルコードを描いてみます。
#import “ViewController.h”
@import SceneKit;
@interface ViewController ()
@property (nonatomic, weak) SCNView *sceneView;
@end
@implementation ViewController
– (void)viewDidLoad {
[super viewDidLoad];
[self setupScene];
[self createUmbrella];
[self createCamera];
}
– (void)setupScene {
SCNView *sv = [[SCNView alloc] initWithFrame:self.view.bounds];
sv.backgroundColor = [self color:4];
sv.scene = [SCNScene scene];
sv.autoenablesDefaultLighting = YES;
sv.allowsCameraControl = YES;
[self.view addSubview:sv];
self.sceneView = sv;
}
– (void)createUmbrella {
SCNCylinder *stick = [SCNCylinder cylinderWithRadius:0.05 height:8];
stick.firstMaterial.diffuse.contents = [self color:3];
SCNNode *stickNode = [SCNNode nodeWithGeometry:stick];
[self.sceneView.scene.rootNode addChildNode:stickNode];
for (int i=0; i<18; i++) {
SCNCylinder *rib = [SCNCylinder cylinderWithRadius:0.02 height:6];
rib.firstMaterial.diffuse.contents = [self color:2];
SCNNode *ribNode = [SCNNode nodeWithGeometry:rib];
ribNode.name = @”rib”;
ribNode.pivot = SCNMatrix4MakeTranslation(0, 2.5, 0);
ribNode.position = SCNVector3Make(0, 3.5, 0);
SCNNode *ribWrap = [SCNNode node];
ribWrap.rotation = SCNVector4Make(0, 1, 0, i * M_PI / 9.0);
[ribWrap addChildNode:ribNode];
[self.sceneView.scene.rootNode addChildNode:ribWrap];
SCNBox *cover = [SCNBox boxWithWidth:0.02 height:6 length:1.6 chamferRadius:0];
cover.firstMaterial.diffuse.contents = [self color:0];
SCNNode *coverNode =[SCNNode nodeWithGeometry:cover];
[ribNode addChildNode:coverNode];
SCNBox *line = [SCNBox boxWithWidth:0.03 height:0.6 length:1.4 chamferRadius:0];
line.firstMaterial.diffuse.contents = [UIColor whiteColor];
SCNNode *lineNode = [SCNNode nodeWithGeometry:line];
[coverNode addChildNode:lineNode];
}
}
– (void)createCamera {
SCNNode *camera = [SCNNode node];
camera.camera = [SCNCamera camera];
camera.position = SCNVector3Make(0, 0, 20);
[self.sceneView.scene.rootNode addChildNode:camera];
}
– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.sceneView.scene.rootNode.childNodes enumerateObjectsUsingBlock:^(SCNNode *n, NSUInteger idx, BOOL *stop) {
SCNNode *rib = [n childNodeWithName:@”rib” recursively:NO];
if (rib) {
rib.name = @””;
[rib runAction:[SCNAction rotateByAngle:1.0 aroundAxis:SCNVector3Make(0, 0, 1) duration:3.0]];
}
}];
}
#define ColorHex(rgb) [UIColor colorWithRed:((rgb & 0xFF0000) >> 16) /255.0 green:((rgb & 0xFF00) >> 8) /255.0 blue:(rgb & 0xFF) / 255.0 alpha:1.0]
– (UIColor *)color:(int)i {
if (i > 4) {
return nil;
}
int colors[] = {0xDC3522, 0xD9CB9E, 0x374140, 0x2A2C2B, 0xEFEFEF};
return ColorHex(colors[i]);
}
@end