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 createPool];

    [self createSwimmingRing];

    [self createStickMan];

}

– (void)setupScene {

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

    sv.backgroundColor = [UIColor whiteColor];

    sv.scene = [SCNScene scene];

    sv.allowsCameraControl = YES;

    sv.autoenablesDefaultLighting = YES;

    sv.delegate = self;

    [self.view addSubview:sv];

    self.sceneView = sv;

}

– (void)createPool {

    SCNTube *outer = [SCNTube tubeWithInnerRadius:5 outerRadius:6 height:2];

    outer.firstMaterial.diffuse.contents = [UIColor greenColor];

    SCNNode *outerNode = [SCNNode nodeWithGeometry:outer];

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

    

    SCNSphere *inner = [SCNSphere sphereWithRadius:3.5];

    inner.firstMaterial.diffuse.contents = [UIColor greenColor];

    SCNNode *innerNode = [SCNNode nodeWithGeometry:inner];

    innerNode.scale = SCNVector3Make(1, 0.4, 1);

    innerNode.position = SCNVector3Make(0, 0.5, 0);

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

    

    SCNCylinder *water = [SCNCylinder cylinderWithRadius:5 height:1.8];

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

    SCNNode *waterNode = [SCNNode nodeWithGeometry:water];

    waterNode.name = @”water”;

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

}

– (void)createSwimmingRing {

    float dw = M_PI / 4.0;

    float r = 4.2;

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

        SCNTorus *ring = [SCNTorus torusWithRingRadius:0.5 pipeRadius:0.15];

        ring.firstMaterial.diffuse.contents = [UIColor colorWithHue:0.1 * i saturation:0.4 brightness:1 alpha:1];

        SCNNode *ringNode = [SCNNode nodeWithGeometry:ring];

        ringNode.name = @”ring”;

        ringNode.pivot = SCNMatrix4MakeTranslation(r * cos(dw * i), –1, r * sin(dw * i));

        ringNode.position = SCNVector3Make(r * cos(dw * i), –1, r * sin(dw * i));

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

        

        ringNode.physicsBody = [SCNPhysicsBody dynamicBody];

        SCNPhysicsShape *shape = [SCNPhysicsShape shapeWithGeometry:ring options:@{SCNPhysicsShapeTypeKey : SCNPhysicsShapeTypeConcavePolyhedron}];

        ringNode.physicsBody.physicsShape = [SCNPhysicsShape shapeWithShapes:@[shape] transforms:@[[NSValue valueWithSCNMatrix4:SCNMatrix4MakeTranslation(-r * cos(dw * i), 1, -r * sin(dw * i))]]];

        ringNode.physicsBody.velocityFactor = SCNVector3Make(0, 0, 0);

        ringNode.physicsBody.angularVelocityFactor = SCNVector3Make(0, 1, 0);

    }

}

– (void)createStickMan {

    SCNSphere *head = [SCNSphere sphereWithRadius:0.6];

    head.firstMaterial.diffuse.contents = [UIColor grayColor];

    SCNNode *stick = [SCNNode nodeWithGeometry:head];

    stick.position = SCNVector3Make(0, 2, 4);

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

    stick.name = @”stick”;

}

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

{

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

    stick.name = @””;

    stick.physicsBody = [SCNPhysicsBody dynamicBody];

    [self createStickMan];

}

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

    [self.sceneView.scene.rootNode.childNodes enumerateObjectsUsingBlock:^(SCNNode *n, NSUInteger idx, BOOL *stop) {

        if ([n.name isEqual:@”ring”]) {

            n.physicsBody.angularVelocity = SCNVector4Make(0, 1, 0, 1.0);

        }

    }];

}

@end