Cocoa練習帳 -19ページ目

[OSX]Teapot

『OpenGL+GLSLによる物理ベースCGアニメーション』では、独自の動物の物体を描画していたが、これを動かすようにするのは大変と思うし、本質的でないのでGLUTで用意されているティーポットを使うことにした。




このティーポットはソリッドとワイヤーフレームの二種類が用意されているので、wキーが押下されるとトグルで切り替わるようにした。




int width = 600;
int height = 500;
BOOL    isWireframe = NO;
 
void resize(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    width = w;
    height = h;
}
 
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    if (! isWireframe)
        glutSolidTeapot(0.5);
    else
        glutWireTeapot(0.5);
    
    glutSwapBuffers();
}
 
void keyboard(unsigned char key, int x, int y)
{
    switch((unsigned char)key) {
        case 'w':
            isWireframe = !isWireframe;
            break;
    }
}
 
void idle(void)
{
    glutPostRedisplay();
}
 
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        glutInit(&argc, (char **)argv);
        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
        glutInitWindowSize(width, height);
        glutInitWindowPosition(500, 100);
        glutCreateWindow("IRIS GL");
        glutReshapeFunc(resize);
        glutDisplayFunc(display);
        glutKeyboardFunc(keyboard);
        glutSpecialFunc(special);
        glutMouseFunc(mouse);
        glutMotionFunc(motion);
        glutIdleFunc(idle);
        init();
        
        glutMainLoop();
    }
    return 0;
}



まだ、平面なのでワクワク感が足らないが。




Teapot





ソースコード
GitHubからどうぞ。

https://github.com/murakami/workbook/tree/master/mac/IRIS - GitHub



関連情報
Using GLUT and OpenGL on Mac OS X

OpenGL Progrmming Guide for Mac

OpenGL Programming on Mac OS X

OpenGL+GLSLによる物理ベースCGアニメーション



【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)

[OSX]Using GLUT and OpenGL on Mac OS X

先日のMSM2012の抽選会で『OpenGL+GLSLによる物理ベースCGアニメーション』をいただいてしまった。これは自分に対する宿題と考え、OpenGLについて取り組んでみることにする。




ただ、この書籍はサンプルコードで動きを確認しながら学習していく内容なのだが、Windows環境向けで、OS XのXcodeで動かすのは困難な為、一つずつ、進める事にした。




GLUTのアプリケーションをXcodeでビルドするには、以下のヘッダーファイルをインクルードする必要がある。




#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>



そして、以下の内容でMakefileを記述すればいい。




cc -framework GLUT -framework OpenGL -framework Cocoa glutapp.c -o glutapp



ただ、折角のOSXなので、Xcodeを利用したい。ということで、著者は以下の手順でプロジェクトを作成した。





  • プロジェクトの雛形は、OS XのCommand Line Tools。
    Cocoaの便利な機能を利用したい為、TypeはC++でなく、Foundationとした。

  • OpenGL.frameworkとGLUT.frameworkを追加する。

  • 雛形で生成されるmain.mをmain.mmに変更して、C++を利用できるようにする。




とりあえず、main.mmを以下の内容にして、GLUTウィンドウが開くことを確認する。




#import <iostream>
#import <Foundation/Foundation.h>
#import <OpenGL/gl.h>
#import <OpenGL/glu.h>
#import <GLUT/glut.h>


void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glutSwapBuffers();
}


int main(int argc, const char * argv[])
{


    @autoreleasepool {
        
        glutInit(&argc, (char **)argv);
        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
        glutInitWindowSize(600, 500);
        glutInitWindowPosition(500, 100);
        glutCreateWindow("GL_Affine");
        glutDisplayFunc(display);
        glutMainLoop();
    }
    return 0;
}



関連情報
Using GLUT and OpenGL on Mac OS X

OpenGL Progrmming Guide for Mac

OpenGL Programming on Mac OS X

OpenGL+GLSLによる物理ベースCGアニメーション



【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)

[iOS]画面キャプチャ

任意のビューコントローラの表示内容をキャプチャするメソッドを作成してみた。




- (UIImage *)imageScreenShot:(UIViewController *)viewController
{
    UIGraphicsBeginImageContextWithOptions(viewController.view.frame.size, 1.0, 0.0);
    [viewController.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}



【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)

MOSA Software Meeting 2012

今年も開催されました。

私への宿題は、得られたモチベーションをどう形にして行くかです!




MSM2012





【Cocoa練習帳】

http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)

[Web]Chrome Tech Talk Night #4

2012年10月24日水曜日に開催されたChrome Tech Talk Night #4について簡単にまとめる。





名称: Chrome Tech Talk Night #4
日時: 2012 年 10 月 24 日(水) 19:00 - 21:00 (受付 18:30 ~ 19:30)
場所: Google 東京オフィス 六本木ヒルズ森タワー 27 階 
会費: 無料
主催: Google



モバイルアプリの最新動向 - High DPI とマルチタッチ( From High-DPI to multi-touch: cutting edge mobile web )(講演者:Boris Smusさん)

スライド

モバイルは多様な環境があるため、それに対応する方法を現状と将来の方向性について発表された。

一つは、iOSでいうところのRetina。様々な画面解像度に対応するお話で、iOSの場合、UIKitのサイズと、ピクセルサイズを別の物として、UIKitでのサイズは、非RetinaとRetinaで変化がないように見せたり、画像について、ファイル名を工夫して、Retinaと非Retinaの画像をフレームワーク側で使い分けてくれる方法を用意してくれているが、Webの場合は簡単には行かず、個々の状況に合わせてベストな方法を選択するということになるようだ。

もう一つの大きな発表のテーマは、デスクトップのキーボード/マウスのイベントと、モバイルのマルチタッチをどう扱うかで、将来の話となるが、Microsoftが提案しているPointイベントが紹介された。




モバイルアプリの最新動向 - High DPI とマルチタッチ( From High-DPI to multi-touch: cutting edge mobile web )(講演者:Boris Smusさん)

スライド

ウェブアプリケーション開発を楽しく効率的に実施する為の様々は手法を紹介する発表で、その一つとして、Yeomanを紹介していた。




関連情報
Chrome Tech Talk Night #4 を開催します



【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)

[iOS]地図(地図の種類)

Bing Mapsの地図の種類は、BMMapModeRoadとBMMapModeAerial、BMMapModeAerialWithLabelsの3つから選択できる。意味は、通常の地図と航空写真、説明付き航空写真という事だと思う。




標準の地図アプリケーションに似せて、サンプルコードに設定用ビューコントローラを追加し、地図の種類が切り替えられるようにしてみた。以下が地図の種類を切り替えるコードだ。




- (IBAction)mapMode:(id)sender
{
    UISegmentedControl  *mapModeSegmentedControl = sender;
    switch (mapModeSegmentedControl.selectedSegmentIndex) {
        case BMMapModeRoad:
            self.mapView.mapMode = BMMapModeRoad;
            break;
        case BMMapModeAerial:
            self.mapView.mapMode = BMMapModeAerial;
            break;
        case BMMapModeAerialWithLabels:
            self.mapView.mapMode = BMMapModeAerialWithLabels;
    }
}




settings


標準の地図アプリケーションでは、設定画面への遷移は、mapCurelという非公開のアニメーションを使っているようだが、なんとかして、似せれたらと思っている。

BitzMaps




ソースコード
GitHubからどうぞ。

https://github.com/murakami/workbook/tree/master/ios/VirtualEarth - GitHub



関連情報
Bing Maps iOS Control

New Bing Maps iOS SDK

Bing Maps Control for iOS

使ってみよう! Bing API/SDK



【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)

[iOS]地図(住所検索)

地図アプリケーションといえば住所から地図を検索する機能を期待すると思うが、住所から位置情報を取得する機能はBing Maps iOS SDKに含まれていない。特に、Bingにこだわる必要はないが、せっかくなので、Bing Maps REST Servciesを使うことにした。


以下が検索要求を出すコードだ。


- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    if ((searchBar.text == nil) || (searchBar.text.length <= 0))    return;
    self.data = [[NSMutableData alloc] init];
    NSString    *bingMapsKey = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"BingMapsKey"];
    NSString    *query = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                                     (CFStringRef)searchBar.text,
                                                                                     NULL,
                                                                                     (CFStringRef)@"!*%'();:@&=+-$,/?%#[]~",
                                                                                     kCFStringEncodingUTF8);
    NSString    *url = [[NSString alloc] initWithFormat:@"http://dev.virtualearth.net/REST/v1/Locations?query=%@&key=%@&c=%@-%@",
                        query,
                        bingMapsKey,
                        [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode],
                        [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]];
    NSLog(@"url: %@", url);
    NSURLRequest    *urlRequest = nil;
    urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    [NSURLConnection connectionWithRequest:urlRequest delegate:self];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

cパラメータにja-jpを指定しないと、日本語の住所が上手く検索できない。当初、入力されたテキストの言語に対応したcパラメータの指定を考えてみたが、よい考えが思い浮かばなかったので、止めた。


応答結果から緯度経度を取り出して、その位置を表示するコードだ。


- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    
    NSError *error = nil;
    NSDictionary    *content = [NSJSONSerialization JSONObjectWithData:self.data options:NSJSONReadingAllowFragments error:&error];
    NSLog(@"content:%@", content);
    
    if (content) {
        NSArray *resourceSets = [content objectForKey:@"resourceSets"];
        NSLog(@"resourceSets:%@", resourceSets);
        
        if (resourceSets) {
            NSDictionary    *resource = [resourceSets objectAtIndex:0];
            NSLog(@"resource:%@", resource);
            
            if (resource) {
                NSArray    *resources = [resource objectForKey:@"resources"];
                NSLog(@"resources:%@", resources);
                
                if ((resources) && (0 < [resources count])) {
                    resource = [resources objectAtIndex:0];
                    NSLog(@"resource:%@", resource);
                    
                    if (resource) {
                        NSDictionary    *point = [resource objectForKey:@"point"];
                        NSLog(@"point:%@", point);
                        
                        if (point) {
                            NSArray *coordinates = [point objectForKey:@"coordinates"];
                            NSLog(@"coordinates:%@", coordinates);
                            
                            if ((coordinates) && (0 < [coordinates count])) {
                                NSString    *latitude = [coordinates objectAtIndex:0];
                                NSString    *longitude = [coordinates objectAtIndex:1];
                                NSLog(@"latitude:%@", latitude);
                                NSLog(@"longitude:%@", longitude);
                                
                                if ((latitude) && (longitude)) {
                                    BMCoordinateRegion  newRegion;
                                    newRegion.center.latitude = [latitude floatValue];
                                    newRegion.center.longitude = [longitude floatValue];
                                    newRegion.span.latitudeDelta = 0.005;
                                    newRegion.span.longitudeDelta = 0.005;
                                    
                                    [self.mapView setRegion:newRegion animated:YES];
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    
    if ([self.searchBar canResignFirstResponder])
        [self.searchBar resignFirstResponder];
}

条件分が深くなっているのは格好が悪いが、サンプルなので勘弁して欲しい。


探偵物語の工藤探偵事務所の住所を表示してみた。


BitzMaps


ソースコード
GitHubからどうぞ。

関連情報

【Cocoa練習帳】
http://ameblo.jp/bitz/(ミラー・サイト)

[iOS]地図(補足)

前回の内容を補足する。




現在位置は以下のデリゲートのメソッドで取得した。




- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation  *location = [locations objectAtIndex:0];
    BMCoordinateRegion  newRegion;
    newRegion.center = location.coordinate;
    newRegion.span.latitudeDelta = 0.0;
    newRegion.span.longitudeDelta = 0.0;

    [self.mapView setRegion:newRegion animated:YES];
 
    [self.locationManager stopUpdatingLocation];
}



位置情報は配列となっているが、メソッドを呼ぶまでに複数のイベントが発生した場合に複数個となり、最新の位置情報は末尾となる。なので、上記では先頭の位置情報を取得しているが、宜しくないという事になる。


また、newRegion.spanは表示範囲?どう計算すればいいのか理解できていないが、0.0は宜しくないようで。0.005に変更してみた。




ソースコード
GitHubからどうぞ。

https://github.com/murakami/workbook/tree/master/ios/VirtualEarth - GitHub



関連情報
Bing Maps iOS Control

New Bing Maps iOS SDK

Bing Maps Control for iOS



【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)

[iOS]地図(現在位置を表示)

住所から現在位置を取得するサンプルがないことを考えると、ここは検索サービスの領域でライセンスという問題がありそうだ。


現在位置を取得して、そこを表示する事には制限はないようなので、試してみる事にする。




ビューコントローラをCLLocationManagerDelegateに対応させる。




#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <CoreLocation/CLLocationManagerDelegate.h>
#import "BingMaps/BingMaps.h"
 
@interface VirtualEarthViewController : UIViewController <BMMapViewDelegate, CLLocationManagerDelegate>
@property (nonatomic, weak) IBOutlet BMMapView  *mapView;
@property (nonatomic, strong) CLLocationManager *locationManager;
@end



ビューコントローラが表示される度に、現在位置を取得し、そこを表示する。




- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    [self.locationManager startUpdatingLocation];
}
 
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation  *location = [locations objectAtIndex:0];
    BMCoordinateRegion  newRegion;
    newRegion.center = location.coordinate;
    newRegion.span.latitudeDelta = 0.0;
    newRegion.span.longitudeDelta = 0.0;

    [self.mapView setRegion:newRegion animated:YES];
 
    [self.locationManager stopUpdatingLocation];
}



指定した住所を表示する単純な地図が欲しいのだが、どうしようかな。




ソースコード
GitHubからどうぞ。

https://github.com/murakami/workbook/tree/master/ios/VirtualEarth - GitHub



関連情報
Bing Maps iOS Control

New Bing Maps iOS SDK

Bing Maps Control for iOS



【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)

[iOS]地図(Bing Maps iOS SDK)

WebサービスAPIをアプリケーションで利用する場合、ライセンスについて気をつけないといけない。最近、話題になっている地図サービスもアプリケーション開発者からみるとライセンスがどうなっているのか気になっていた。そこで、現状利用しやすいと思われるMicrosoftのBing Mapsを試してみる事にした。




入手方法は、『関連情報』のURLから調べる事が出来るので、これを自分がアプリケーションに組み込んだ手順を紹介する。




テンプレート「Single View Application」でプロジェクトを生成する。




プロジェクトのフォルダに、Bing Mapsの「MapControl」フォルダーをコピーする。




copy




コピーしたフォルダをプロジェクトに追加する。




dd




その際のオプションは既に置かれているファイルなので、コピーの指定は不要だ。




option




Header Search Pathsに、追加した「MapControl」フォルダーを指定する。




hsp




リンカーのフラグに「-ObjC -all_load」を追加する。




linker




Link Binary With Librariesにフレームワークを追加する。




lib




Interface BuilderでViewを追加して、InteractionのMultiple Touchにチェックを入れる。




mt




そして、追加したViewのクラスをBMMapViewに変更する。




class




ビューコントローラのプロトコルにBMMapViewDelegateを指定して、追加したBMMapViewを指すアウトレットを追加する。




#import <UIKit/UIKit.h>
#import "BingMaps/BingMaps.h"
 
@interface VirtualEarthViewController : UIViewController
@property (nonatomic, weak) IBOutlet BMMapView  *mapView;
@end



ビューコントローラのviewDidLoadメソッドで、以下のコードを追加する。




- (void)viewDidLoad
{
    [super viewDidLoad];
    self.mapView.delegate = self;
    [self.mapView setShowsUserLocation:YES];
}



Bing Maps Keyをproperty listに追加する。




bmk




Bing Maps Keyの取得方法は、関連情報を参照して欲しい。




実行。




run





ソースコード
GitHubからどうぞ。

https://github.com/murakami/workbook/tree/master/ios/VirtualEarth - GitHub



関連情報
Bing Maps iOS Control

New Bing Maps iOS SDK

Bing Maps Control for iOS



【Cocoa練習帳】
http://www.bitz.co.jp/weblog/

http://ameblo.jp/bitz/(ミラー・サイト)