
横からライトを当てて月の満ち欠けを表示するiPhoneアプリのサンプルコードを描いてみます。
#import “ViewController.h”
@import SceneKit;
@interface ViewController() <SCNSceneRendererDelegate>
@property (nonatomic, weak) SCNView *sceneView;
@property (nonatomic) BOOL move;
@end
@implementation ViewController
– (void)viewDidLoad {
[super viewDidLoad];
[self setupScene];
[self createMoon];
[self createCamera];
[self createLight];
}
– (void)setupScene {
SCNView *sv = [[SCNView alloc] initWithFrame:self.view.bounds];
sv.scene = [SCNScene scene];
sv.backgroundColor = [self color:2];
sv.delegate = self;
[self.view addSubview:sv];
self.sceneView = sv;
}
– (void)createMoon {
SCNSphere *moon = [SCNSphere sphereWithRadius:10];
moon.firstMaterial.diffuse.contents = [self color:1];
moon.firstMaterial.shininess = 1.0;
SCNNode *moonNode = [SCNNode nodeWithGeometry:moon];
[self.sceneView.scene.rootNode addChildNode:moonNode];
}
– (void)createLight {
SCNLight *light = [SCNLight light];
light.type = SCNLightTypeOmni;
light.castsShadow = YES;
SCNNode *lightNode = [SCNNode node];
lightNode.light = light;
lightNode.position = SCNVector3Make(100, 0, 0);
lightNode.rotation = SCNVector4Make(0, 1, 0, –M_PI/2.0);
[self.sceneView.scene.rootNode addChildNode:lightNode];
}
– (void)createCamera {
SCNNode *cameraBox = [SCNNode node];
cameraBox.name = @”box”;
cameraBox.pivot = SCNMatrix4MakeTranslation(0, 0, –70);
[self.sceneView.scene.rootNode addChildNode:cameraBox];
SCNNode *camera = [SCNNode node];
camera.camera = [SCNCamera camera];
[cameraBox addChildNode:camera];
}
– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
self.move = !self.move;
self.sceneView.playing = YES;
}
– (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time
{
if (self.move) {
SCNNode *cameraBox = [self.sceneView.scene.rootNode childNodeWithName:@”box” recursively:NO];
cameraBox.rotation = SCNVector4Make(0, 1, 0, cameraBox.rotation.w + 0.04);
}
}
#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 colorCodes[] = {0xFFFFFF, 0x777777, 0x000000};
return ColorHex(colorCodes[i]);
}
@end