
浮き輪をくるくるする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