iPhone和の傘

和風の傘を表示する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