さて、私はこれをできるだけ簡潔にする方法を厳密に決めました。私はこれを達成し、タッチインタラクションは、ピクセルを選択することができるようにするために、すべてのコードに必要な:)
を一覧表示する、最初のごGLKViewController
サブクラスにUITapGestureRecognizer
を追加する方法について説明下に(あなたはTAP-に選択ピクセルたいと仮定した場合)そのクラスの中に以下のターゲットメソッドを持ちます。、あなたのジェスチャー認識をインスタンス化した後
@interface GLViewController : GLKViewController <GLKViewDelegate, UIGestureRecognizerDelegate>
(GLKViewController
で実際GLKView
ある)view
プロパティに追加:あなたのGLKViewController
サブクラスUIGestureRecognizerDelegate
をしなければならない
// Inside GLKViewController subclass init/awakeFromNib:
[[self view] addGestureRecognizer:[self tapRecognizer]];
[[self tapRecognizer] setDelegate:self];
のターゲットアクションを設定します。あなたのジェスチャーレコグナイザー。 init...
を使って作成するときにこれを行うことができますが、Storyboard(別名「Xcode 4.2の新しいInterface Builder」)を使用して私の鉱山を作成し、それを配線しました。
とにかく、ここに私のターゲットアクションをタップジェスチャー認識のためだ:
-(IBAction)onTapGesture:(UIGestureRecognizer*)recognizer {
const CGPoint loc = [recognizer locationInView:[self view]];
[self pickAtX:loc.x Y:loc.y];
}
そこに呼ばれるピック方法は、私は私のGLKViewController
サブクラス内で定義した1がある:
-(void)pickAtX:(GLuint)x Y:(GLuint)y {
GLKView *glkView = (GLKView*)[self view];
UIImage *snapshot = [glkView snapshot];
[snapshot pickPixelAtX:x Y:y];
}
これは利用していますAppleが親切にGLKView
に含まれており、EAGLContext
からUIImage
を生成する便利な新しいメソッドsnapshot
を公開しました。注意することが重要です何
は述べてsnapshot
APIドキュメント、内のコメントです:
をアプリケーションが明示的 ビューの内容を必要とするたびに、このメソッドが呼び出されるべきです。 OpenGL ES関数を使用して、下にあるフレームバッファの内容を直接読み取ろうとしないでください。
これは私のピクセルデータにアクセスしようとする試みでglReadPixels
を呼び出すために私の以前の試みはEXC_BAD_ACCESS
を生成した理由として手掛かり、代わりに正しい道を私を送っ指標を与えました。
私のpickAtX:Y:
メソッドが瞬間で定義されていることに気づくでしょう。私はUIImage
のpickPixelAtX:Y:
を呼び出します。これは、カスタムカテゴリのUIImage
に追加した方法です。
これは実装です。それは必要な最終的なコードリストです。コードはthis questionから来たとの回答に応じて改正されたが受け取ら:2を必要な「CGImageコンテキストからピクセルデータの取得」:
@implementation UIImage (NDBExtensions)
- (void)pickPixelAtX:(NSUInteger)x Y:(NSUInteger)y {
CGImageRef cgImage = [self CGImage];
size_t width = CGImageGetWidth(cgImage);
size_t height = CGImageGetHeight(cgImage);
if ((x < width) && (y < height))
{
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef bitmapData = CGDataProviderCopyData(provider);
const UInt8* data = CFDataGetBytePtr(bitmapData);
size_t offset = ((width * y) + x) * 4;
UInt8 b = data[offset+0];
UInt8 g = data[offset+1];
UInt8 r = data[offset+2];
UInt8 a = data[offset+3];
CFRelease(bitmapData);
NSLog(@"R:%i G:%i B:%i A:%i",r,g,b,a);
}
}
@end
を私はもともと題しアップルのAPIドキュメントで見つかったいくつかの関連のコードを試してみましたこの1の代わりにメソッド定義が必要ですが、もっと多くのコードが必要です。正しい解釈を実装できなかったタイプのデータがあります。void *
です。
これだけです!それは形式で出力することを意志ピクセルタップすると、あなたのプロジェクトにこのコードを追加します。
R:24 G:46 B:244 A:255
はもちろん、あなたが範囲0になり、それらのRGBAのint型の値を(抽出するいくつかの手段を記述する必要がありますが - 255)、それらを使用したいと思っています。私は今、全体のピッキング機構を終えたし、それが御馳走:) Huzzahに動作します
UIColor *color = [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha/255.0f];
:一つのアプローチは、そうのようにインスタンス化上記の方法から
UIColor
を返すことです! – KomodoDaveこれは本当に素晴らしいことです、投稿してくれてありがとう! – todd412
あなたは大歓迎です:) – KomodoDave