iPhone水道くるくる

水道の蛇口をくるくるするiPhoneアプリのサンプルコードを描いてみます。

#import “ViewController.h”

@import SceneKit;

@interface ViewController () <SCNSceneRendererDelegate>

@property (nonatomic, weak) SCNView *sceneView;

@end

@implementation ViewController

– (void)viewDidLoad {

    [super viewDidLoad];

    [self setupScene];

    [self createTap];

    [self createCamera];

}

– (void)setupScene {

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

    sv.scene = [SCNScene scene];

    sv.backgroundColor = [UIColor blackColor];

    sv.autoenablesDefaultLighting = YES;

    sv.delegate = self;

    [self.view addSubview:sv];

    

    self.sceneView = sv;

}

– (void)createTap {

    SCNBox *body = [SCNBox boxWithWidth:10 height:2.5 length:3 chamferRadius:1];

    body.firstMaterial.diffuse.contents = [UIColor lightGrayColor];

    SCNNode *bodyNode = [SCNNode nodeWithGeometry:body];

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

    

    SCNBox *bar = [SCNBox boxWithWidth:2 height:1.5 length:10 chamferRadius:0.5];

    bar.firstMaterial.diffuse.contents = [UIColor lightGrayColor];

    SCNNode *barNode = [SCNNode nodeWithGeometry:bar];

    barNode.name = @”bar”;

    barNode.pivot = SCNMatrix4MakeTranslation(0, 0, –4);

    barNode.position = SCNVector3Make(0, –3, 0);

    

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

}

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

{

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

    bar.rotation = SCNVector4Make(0, 1, 0, bar.rotation.w + 0.05);

    

    if (arc4random() % 10) {

        SCNBox *water = [SCNBox boxWithWidth:0.2 height:0.5 length:0.03 chamferRadius:0];

        water.firstMaterial.diffuse.contents = [UIColor whiteColor];

        water.firstMaterial.specular.contents = [UIColor blueColor];

        SCNNode *waterNode = [SCNNode nodeWithGeometry:water];

        waterNode.position = [bar.presentationNode convertPosition:SCNVector3Make(0, –1, 4.5) toNode:self.sceneView.scene.rootNode];

        waterNode.physicsBody = [SCNPhysicsBody dynamicBody];

        [waterNode.physicsBody applyTorque:SCNVector4Make(0, 1, 0, 0.2) impulse:YES];

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

    }

}

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

{

    self.sceneView.playing = YES;

}

-(void)createCamera {

    SCNNode *camera = [SCNNode node];

    camera.camera = [SCNCamera camera];

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

    camera.rotation = SCNVector4Make(1, 0, 0, 0.3);

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

}

@end