iPhone折り紙提灯

折り紙の提灯を表示するiPhoneアプリのサンプルコードを描いてみます。

#import “ViewController.h”

@import SceneKit;

@interface ViewController ()

@property (nonatomic, weak) SCNView *sceneView;

@end

@implementation ViewController

– (void)viewDidLoad {

    [super viewDidLoad];

    [self setupScene];

    [self createLamp:[UIColor redColor]];

    [self createCamera];

    [self createLight];

}

– (void)setupScene {

    SCNView *sv = [[SCNView alloc] initWithFrame:self.view.bounds];

    sv.backgroundColor = [UIColor colorWithWhite:0.05 alpha:1];

    sv.scene = [SCNScene scene];

    sv.allowsCameraControl = YES;

//    sv.autoenablesDefaultLighting = YES;

    [self.view addSubview:sv];

    

    self.sceneView = sv;

}

– (SCNNode *)createLamp:(UIColor *)color {

    int n = 20;

    float dw = M_PI / (n * 0.5);

    float r = 1;

    float w = 2.0 * r * sin(dw * 0.5);

    float h = 2.8 * w;

    

    SCNNode *lamp = [SCNNode node];

    [self.sceneView.scene.rootNode addChildNode:lamp];

    

    for (int i=0; i<n; i++) {

        for (int j=0; j<4; j++) {

            SCNBox *b = [SCNBox boxWithWidth:w height:h length:0.01 chamferRadius:0];

            b.firstMaterial.diffuse.contents = color;

            SCNNode *bNode = [SCNNode nodeWithGeometry:b];

            bNode.transform = SCNMatrix4MakeTranslation(0, 0, r);

            bNode.transform = SCNMatrix4Rotate(bNode.transform, dw * i, 0, 1, 0);

            [lamp addChildNode:bNode];

            if (j==1) {

                bNode.pivot = SCNMatrix4Translate(bNode.pivot, 0, -h * 0.5, 0);

                bNode.transform = SCNMatrix4Translate(bNode.transform, 0, h * j – 0.5 * h, 0);

                [bNode runAction:[SCNAction group:@[[SCNAction rotateByX:M_PI * 0.2 y:0 z:0 duration:3.8], [SCNAction moveByX:0 y: h – h * cos(0.2 * M_PI) z:0 duration:4.0]]]];

            } else if (j==2) {

                bNode.pivot = SCNMatrix4Translate(bNode.pivot, 0, h * 0.5, 0);

                bNode.transform = SCNMatrix4Translate(bNode.transform, 0, h * j + 0.5 * h, 0);

                [bNode runAction:[SCNAction group:@[[SCNAction rotateByX:-M_PI * 0.2 y:0 z:0 duration:3.8], [SCNAction moveByX:0 y: -(h – h * cos(0.2 * M_PI)) z:0 duration:4.0]]]];

            } else if (j == 3) {

                bNode.transform = SCNMatrix4Translate(bNode.transform, 0, h * j, 0);

                [bNode runAction:[SCNAction moveByX:0 y: -(h – h * cos(0.2 * M_PI)) z:0 duration:4.0]];

            } else if (j == 0) {

                bNode.transform = SCNMatrix4Translate(bNode.transform, 0, h * j, 0);

                [bNode runAction:[SCNAction moveByX:0 y: h – h * cos(0.2 * M_PI) z:0 duration:4.0]];

            }

        }

    }

    [lamp runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:M_PI z:0 duration:5.0]]];

    return lamp;

}

– (void)createCamera {

    SCNNode *camera = [SCNNode node];

    camera.camera = [SCNCamera camera];

    camera.position = SCNVector3Make(0, 0, 20);

    [self.sceneView.scene.rootNode addChildNode:camera];

}

– (void)createLight {

    SCNLight *light = [SCNLight light];

    light.type = SCNLightTypeAmbient;

    light.color = [UIColor colorWithWhite:0.4 alpha:1];

    SCNNode *lightNode = [SCNNode node];

    lightNode.light = light;

    lightNode.position = SCNVector3Make(0, 0, 30);

    [self.sceneView.scene.rootNode addChildNode:lightNode];

    

    SCNLight *light2 = [SCNLight light];

    light2.type = SCNLightTypeDirectional;

    light2.color = [UIColor colorWithWhite:0.4 alpha:1];

    SCNNode *light2Node = [SCNNode node];

    light2Node.light = light2;

    light2Node.position = SCNVector3Make(0, 0, 80);

    [self.sceneView.scene.rootNode addChildNode:light2Node];

}

– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    static float hue = 0.25;

    

    if (hue > 1.0) {

        return;

    }

    

    SCNNode *lamp = [self createLamp:[UIColor colorWithHue:hue saturation:0.7 brightness:1 alpha:1]];

    hue += 0.25;

    

    float x = 5 * cos(hue * M_PI * 2.0 + 0.3);

    float y = 5 * sin(hue * M_PI * 2.0 + 0.3);

    lamp.position = SCNVector3Make(x, y, 0);

}

@end