4

ここでOpenGLESの新機能。次のコードを使用して、GLKView(OpenGL ES 2.0)でタップした場所を検出しています。OpenGLで描画されたオブジェクトに触れたかどうか知りたいのですが。それはすべて2Dです。取得している座標を、一見-1.0から1.0ベースのOpenGL ES 2.0座標に変換するにはどうすればよいですか?そのための組み込み関数はすでにありますか?

ありがとう。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGRect bounds = [self.view bounds];

    UITouch* touch = [[event touchesForView:self.view] anyObject];

    CGPoint location = [touch locationInView:self.view];

    NSLog(@"x: %f y: %f", location.x, location.y);

}
4

1 に答える 1

2

-1対1はクリッピングスペースです。画面に表示されたときに座標空間がクリッピング空間にある場合は、射影行列を使用して空間を変換するのを忘れたと思います。使用している場合GLKBaseEffect(どこでもメモリリークが発生する傾向があるため、後でお勧めしません)<baseEffect>.transform.projectionMatrix、スペースを正しく変換するマトリックスに設定する必要があります。例えば、

GLKBaseEffect* effect = [[GLKBaseEffect alloc] init];
GLKMatrix4 projectionMatrix = GLKMatrix4MakeOrtho(0, <width>, 0, <height>, 0.0f, 1.0f);
self.effect.transform.projectionMatrix = projectionMatrix;

widthheightデバイスの画面// GLKViewetcの幅と高さになります。これは、渡した座標に自動的に適用されるため、画面の左下隅を原点として、軸上で0から軸上および軸<width>上で0からの範囲の通常の座標を使用できます。x<height>y

私のようなカスタムシェーダーを使用している場合は、次を使用して投影行列を均一に渡すことができます。 glUniformMatrix4fv(shaderLocations.projectionMatrix,1,0,projection.m)

ここprojectionで、は行列であり、shaderLocations.projectionMatrixはユニフォームの識別子です。彼らが言うように、その名前です。次に、位置に射影行列を掛ける必要があります。

マトリックスを手動で渡すか、正しいプロパティをに設定することにより、クリッピングスペースから変換した後、GLKBaseEffectOpenGLスペースとUIKitスペースの唯一の違いは、y軸が反転することです。touchesこのようなメソッドとジェスチャレコグナイザーを介して受け取ったタッチを変換します。

CGPoint openGLTouch = CGPointMake(touch.x, self.view.bounds.size.height - touch.y);

質問がある場合は明確にするために最善を尽くしますが、私自身はOpenGLに比較的慣れていないことを覚えておいてください。:)

于 2013-02-05T08:30:57.013 に答える