iPhoneバネぐるぐる

輪っかをぐるぐる増やしていくiPhoneアプリのサンプルコードを描いてみます。

#import “ViewController.h”

@import SceneKit;

@interface ViewController () <SCNSceneRendererDelegate>

@property (nonatomic, weak) SCNView *sceneView;

@property (nonatomic) int counter;

@end

@implementation ViewController

– (void)viewDidLoad {

    [super viewDidLoad];

    [self setupScene];

    [self createCamera];

}

– (void)setupScene {

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

    sv.playing = NO;

    sv.scene = [SCNScene scene];

    sv.delegate = self;

    sv.backgroundColor = [UIColor blackColor];

    sv.allowsCameraControl = YES;

    [self.view addSubview:sv];

    

    self.sceneView = sv;

}

– (void)createCamera {

    SCNNode *camera = [SCNNode node];

    camera.camera = [SCNCamera camera];

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

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

}

– (void)createRing:(SCNMatrix4)transform {

    float hue = (self.counter % 10) * 0.1;

    SCNTorus *ring = [SCNTorus torusWithRingRadius:1 pipeRadius:0.05];

    ring.firstMaterial.diffuse.contents = [UIColor colorWithHue:hue saturation:0.3 brightness:1 alpha:1];

    SCNNode *ringNode = [SCNNode nodeWithGeometry:ring];

    ringNode.transform = transform;

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

}

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

{

    self.sceneView.playing = YES;

}

– (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time

{

    if (self.counter > 500) {

        self.sceneView.playing = NO;

        return;

    }

    

    float w = M_PI / 60.0 * self.counter;

    float r = 10.0;

    float x = r * cos(w);

    float y = self.counter * 0.04;

    float z = r * sin(w);

    SCNMatrix4 transform = SCNMatrix4Identity;

    transform = SCNMatrix4Rotate(transform, M_PI_2, 1, 0, 0);

    transform = SCNMatrix4Rotate(transform, -w, 0, 1, 0);

    transform = SCNMatrix4Translate(transform, x, y, z);

    [self createRing:transform];

    

    self.counter++;

}

@end