ついにというか、簡単な3D仕事の打診が来てしまいました。
しかし仕様的にすごく簡単っぽい
(3Dオブジェクトと2Dの画像を合成するとだけと言ったような)
物だったので、何とかやってみることにしました。
まず第一に、本当にその合成は出来るのか?
と思い調べてみることに。
いろいろなサイトを見て回ったのですが、
初心者はまず、appleのサイト
http://developer.apple.com/jp/iphone/library/japanese.html
にある、「iPhone OpenGL ES プログラミングガイド」
を見た方が良いとの事だったので、4時間くらいかけて読む。
これを見ると、30Pの「結果の表示」の所に、
␣␣␣␣␣␣␣␣␣コンテンツをその他のレイヤとブレンドしなければならない場合は、CAEAGLLayerオブ ジェクトを不透過にするとパフォーマンスの低下を抑えることができます。ただし、パフォーマン スの低下をなくすことはできません。
CAEAGLLayerオブジェクトをその他のレイヤと合成しなければならない場合は、大幅にパフォーマ ンスが低下します。CAEAGLLayerをその他の␣␣␣␣␣レイヤの背後で再生することによって、このパ フォーマンス低下を抑えることができます。
と書いてあるので、取りあえず合成は出来そうだな・・
と言うことがわかりました。
その他には
・OpenGL1.1と2.0の具体的な違い、
(このPDFには載っていないのですが、
ハードウェア的には
iPhone3G/Touch=1.1、iPhone3GS=2.0なので、
現状では1.1を選択しておくのが良さそう)
・最適化するにはどうすればいいのか
(この辺りは取りあえず読み飛ばしましたけど)
・実際にどのような順路をたどり出力されてるのか
が何となく・・すごく何となくですが・・
わかりました。
自分の中での締め切りは、来週頭〜来週中くらいまでかと思っているのですが、果たしてそれまでで出来るのか?
また、進捗を書いていこうと思います。
kuni プログラム openGL
JSファイルやhtmlをローカルで読み込ませてUIWebViewで表示しようとして、
FileManagerのcopyItemAtPathで特定のパスにコピーしようとしたところ、
JSファイルのみコピーできなかったが、どうもアプリに内包されていないようで、
手動でターゲットの「ハンドルリソースをコピー」のフォルダに入れることで、
アプリに入るようになり、コピー出来るようになった。
kuni プログラム
Ignoring packet error, continuing…
と、実機でデバッグを行うとコンソールに出てしまって、NSLOGの値などが出てこなかったのですが、
単純に、distribution用のProvisionファイルで動かしてしまっていたので出ていたようです。
普通に制作用のProvisionファイルで動作させれば、このメッセージは出ず、正常にデバッグできました。
kuni プログラム
coverflowを再現するオープンソースライブラリ
http://www.chaosinmotion.com/flowcover.m
kuni プログラム
saxパーサであるlibxml2でattributeの中身を出すのに苦労したので、ここに書きます。
xmlSAXHandlerの「startElementNsSAX2Func」部分に、読み出してくれる関数を設定し、
受け側関数部分は、
static void startElementSAX(void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes)
の様に書きますが、一見、attributesをnb_attributesの数だけ出力すればすぐ出るんじゃないの?
と思いますが、そこを出しても、例えば
<rss version=”2.0″>
の様なタグがああった場合、「version」という部分しか出ないんですね..。
javaのlibxml2ばかり出てきてしまい、非常に時間がかかったのですが、いろいろ探しまわった結果、
http://blogs.dion.ne.jp/p50p100/archives/6751189.html
に書かれている事をする事で、ちゃんと「2.0」部分まで取れるようになりました。
修正したのは、受側関数部分のattributeの所を以下のように修正、
static void startElementSAX(void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar *(*attributes)[5]) {
それで以下のように
for(int i=0;i
NSString *string = [NSString stringWithFormat:@"%s=\"%.*s\"" , attributes[i][0], attributes[i][4] – attributes[i][3], attributes[i][3] ];
NSLog(string);
}
取得する事で、きちんと
「version=”2.0″」と取る事が出来ました。
引数の受け取り方自体を書き換え、文字列を切って表示するという方法?でしょうか。
kuni プログラム
NSURL *URL = [NSURL URLWithString:@"ダイジェスト認証がかかったアドレス"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];
以上で開始し、
-(void)connection:(NSURLConnection *)aConnection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge previousFailureCount] == 0) {
NSURLCredential *newCredential;
newCredential = [NSURLCredential credentialWithUser:@"ユーザー名" password:@"パス" persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
} else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
で一旦受ける。
(※http://stackoverflow.com/questions/589377/in-the-iphone-sdk-how-would-you-programatically-pass-a-username-password-to-a
を参考にさせていただきました。)
上記でユーザー名、パスが正しく送り返されれば、その他のdelegate、
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
などに情報が来る。
kuni プログラム
■ホーム画面のアプリアイコン横に数字を表示
[UIApplication sharedApplication].applicationIconBadgeNumber = N;
[UIApplication sharedApplication].applicationIconBadgeNumber = 0; で消える。
■ホーム「設定」アプリ内の設定部分に自分のアプリの設定画面を入れる
http://developer.apple.com/jp/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ApplicationSettings/ApplicationSettings.html#//apple_ref/doc/uid/TP40007072-CH13-SW10
http://ameblo.jp/xcc/entry-10172820087.html
※アプリから読み取るときは、
BOOL testValue = [[NSUserDefaults standardUserDefaults] boolForKey(型に合わせて変えるstringForKey、など):@”enabled_preference(Identifierに書かれている物を入れる)”];
■Facebook connectのiPhoneSDKをOS3.0で動かしたときのコンパイルエラーを取り除く
http://forum.developers.facebook.com/viewtopic.php?pid=143467
※エラー部分をコメントアウトするだけでOKっぽい。
■tableViewに「次を読み込む」処理を入れる
http://d.hatena.ne.jp/KishikawaKatsumi/20090118/1232224534
※これ、基本的に手動だったんですね..app storeアプリとか、apple純正のやつでも使われているから、
SDKで用意されているのかと思っていた..
■textの高さを取る
CGSize tempSize = CGSizeMake(320 , 999);
CGSize textSize = [NSStringObj sizeWithFont:UIfontObj constrainedToSize: tempSize];
NSLog(@”%f , %f” , textSize.width , textSize.height);
※ただし、行間は設定できない模様..
やはり、styleでline-Height設定をしたhtmlをUITextViewに読み込むしかなさそう。
UILabel、UITextViewなどでも行間や字間くらい出来ても良さそうなんですけどね…
■MD5文字列を生成
http://miketeo.net/wp/index.php/2008/09/22/calculating-md5-digest-with-iphone-sdk.html
■status barにインジケーターを表示(ネットワーク要求があれば自動的に出るという訳ではなかったんですね…)
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
kuni プログラム
kuniです。
「http://~~/128459253/roロゴ_normal.png」
と言うようなxmlに書かれたアドレスをNXXMLパーサーで取得しようと思い、
URLエンコードは、
http://akisute.com/2008/12/cocoaiphoneurl.html
に書いていただいている物などを使えばいいのかと思いきや、
そもそも、
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
のStringに入ってくる時点で、なぜか
「http://~~/128459253/ro」
という文字列になってしまっていました。
http://journal.mycom.co.jp/column/iphone/007/index.html
を見ると、NSXMLParserの方が高速みたいですし、
こちらを使ってみようかと思います。
※追記
切れてしまう問題かと思いきや、
NSXMLParserの使い方が間違っていました。
ファイルをダウンロードする時などと同様に、
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
に来たstringは全部ではないので
(長さにもよるとは思いますが、
英語では一回で全文字来るようなのですが、
日本語では1文字1文字でしかここには来ないようです)、
一旦、NSMutableStringなどに入れ、
-(void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
の部分で完了が解るので、そこで初めて、貯めておいた文字列を使う、
という流れにしないとだめでした。
読んだ文字列をまとめた物を
送ってくれるメソッドが欲しいなあとも思いますが・・
これで取りあえず解決できました。
kuni プログラム
imagePickerControllerのdidFinishPickingImageが実行された後、
イメージをそのまま使うと、動作には問題ないようなのですが、なぜか
「<Error>: CGAffineTransformInvert: singular matrix.」
というエラーが出てしまっていたので、
一度、
UIGraphicsBeginImageContext(image.size);//イメージをそのまま使うとエラーが出るようなので一旦置き換える//
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
[image drawInRect:rect];
// 描画した画像を取得する
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
と言ったような形で、置き換えた物を使用しました。
これだと、出ないようです・・。
※imagePickerControllerのプロパティ、
allowsImageEditingがYESだと、
この問題は起こらないようです。
kuni プログラム
kuniです。
UIBarItemのプロパティ「enable」がありますが、
これをinterface builderからNOにしておくと、
OS2.1以降では勝手に半透明になってくれますが、
OS2.0では半透明になりません。(意外にもOS2.1でも半透明になりました。)
なのであらかじめ透明度を設定したpngを用意しておき、
UIBarItemのimageを入れ替える方法で回避しようかと思いきや、
なぜか下記のように、もう一度同じイメージをスクリプトで設定し直すと、
効くようになりました。
NSString* model = [[UIDevice currentDevice]systemVersion];
NSComparisonResult result_os = [model compare:@"2.0"];
if(result_os == NSOrderedSame){
//このバージョンの場合、ボタンが透明にならない。だが一度置き換えるとなぜか効くようになる。//
NSString *imgPath = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath] , @”btn_setting.png”];
UIImage *settingBtnImage = [UIImage imageWithContentsOfFile: imgPath];
settingBtn.image = settingBtnImage;
}
interface builderのバグか・・
kuni プログラム