iPhone回転変動錯視

四隅が隠れるような丸を配置して、四角形を回転させると大きさが変わって見えるよという錯視のiPhoneアプリのサンプルコードを描いてみます。

#import “ViewController.h”

@import SceneKit;

@interface ViewController ()

@property (nonatomic, weak) SCNView *sceneView;

@end

@implementation ViewController

– (void)viewDidLoad {

    [super viewDidLoad];

    [self setupScene];

    [self createRectangle];

    [self createCamera];

}

– (void)setupScene {

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

    sv.backgroundColor = [self color:2];

    sv.scene = [SCNScene scene];

    sv.allowsCameraControl = true;

    [self.view addSubview:sv];

    self.sceneView = sv;

}

– (void)createRectangle {

    float r = 20.0;

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

        float x = r * cos(M_PI_2 * i + M_PI_4);

        float y = r * sin(M_PI_2 * i + M_PI_4);

        SCNSphere *dot = [SCNSphere sphereWithRadius:10];

        dot.firstMaterial.diffuse.contents = [self color:0];

        SCNNode *node = [SCNNode nodeWithGeometry:dot];

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

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

    }

    

    SCNBox *rect = [SCNBox boxWithWidth:30 height:30 length:1 chamferRadius:0];

    rect.firstMaterial.diffuse.contents = [self color:1];

    SCNNode *rectNode = [SCNNode nodeWithGeometry:rect];

    rectNode.name = @”rect”;

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

}

– (void)createCamera {

    SCNNode *camera = [SCNNode node];

    camera.camera = [SCNCamera camera];

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

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

}

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

{

    SCNNode *rect = [self.sceneView.scene.rootNode childNodeWithName:@”rect” recursively:NO];

    if (!rect.hasActions) {

        [rect runAction:[SCNAction rotateByAngle:2.0 * M_PI aroundAxis:SCNVector3Make(0, 0, 1) duration:5.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 > 2) return nil;

    int colorCode[] = {0x2F2933, 0xBDF271, 0x01A2A6};

    return ColorHex(colorCode[i]);

}

@end