iPhone月の満ち欠け

横からライトを当てて月の満ち欠けを表示する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