iPhoneカメラ絞り

カメラの絞りみたいな動きをさせるiPhoneアプリのサンプルコードを描いてみます。

#import “ViewController.h”

@import SceneKit;

@interface ViewController ()

@property (nonatomic, weak) SCNView *sceneView;

@property (nonatomic) BOOL open;

@end

@implementation ViewController

– (void)viewDidLoad {

    [super viewDidLoad];

    [self setupScene];

    [self createApeture];

    [self createCamera];

}

– (void)setupScene {

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

    sv.backgroundColor = [UIColor yellowColor];

    sv.scene = [SCNScene scene];

    sv.allowsCameraControl = YES;

    sv.autoenablesDefaultLighting = YES;

    [self.view addSubview:sv];

    

    self.sceneView = sv;

}

– (void)createApeture {

    float w = M_PI / 6.0;

    float r = 5.0;

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

        SCNBox *box = [SCNBox boxWithWidth:8 height:3 length:0.1 chamferRadius:0];

        box.firstMaterial.diffuse.contents = [UIColor darkGrayColor];

        SCNNode *boxNode = [SCNNode nodeWithGeometry:box];

        boxNode.name = @”box”;

        boxNode.pivot = SCNMatrix4Translate(boxNode.transform, 2.4, 1.4, 0);

        

        float x = r * cos(i * w);

        float y = r * sin(i * w);

        boxNode.position = SCNVector3Make(x, y, 0.03 * i);

        boxNode.rotation = SCNVector4Make(0, 0, 1, i * w + M_PI * 0.5);

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

    }

    

    SCNTube *tube = [SCNTube tubeWithInnerRadius:5.5 outerRadius:11 height:1];

    tube.firstMaterial.diffuse.contents = [UIColor darkGrayColor];

    SCNNode *tubeNode = [SCNNode nodeWithGeometry:tube];

    tubeNode.transform = SCNMatrix4Rotate(tubeNode.transform, M_PI/2.0, 1, 0, 0);

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

}

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

{

    [[self.sceneView.scene.rootNode childNodesPassingTest:^BOOL(SCNNode *child, BOOL *stop) {

        return [child.name isEqual:@”box”];

    }] enumerateObjectsUsingBlock:^(SCNNode *obj, NSUInteger idx, BOOL *stop) {

        [obj runAction:[SCNAction rotateByX:0 y:0 z:self.open ? 1.2 : –1.2  duration:1.0]];

    }];

    

    self.open = !self.open;

}

– (void)createCamera {

    SCNNode *camera = [SCNNode node];

    camera.camera = [SCNCamera camera];

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

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

}

@end