¿Detectar el toque en el objeto OpenGL?

Estoy desarrollando una aplicación que utiliza OpenGL para renderizar las imágenes.

Ahora sólo quiero determinar el evento táctil en el objeto de esfera opengl que he construido.

Aquí dibujo 4 objetos en la pantalla. Ahora cómo voy a saber qué objeto ha sido

tocado. He utilizado el método onTouchEvent (). Pero me da sólo x y y coordenadas, pero mi

Objeto se dibuja en 3D.

Por favor ayuda ya que soy nuevo en OpenGL.

Saludos cordiales, ~ Anup Introduzca aquí la descripción de la imagen

T Google IO había una sesión sobre cómo se utilizó OpenGL para Google Body en Android. La selección de las partes del cuerpo se hizo mediante la representación de cada uno de ellos con un color sólido en un búfer oculto, a continuación, sobre la base del color que estaba en el toque x, y el objeto correspondiente podría ser encontrado. Para propósitos de rendimiento, sólo una pequeña área recortada de 20×20 píxeles alrededor del punto de contacto se procesó de esa manera.

Ambos enfoques (1. buffer de color oculto y 2. prueba de intersección) tiene su propio mérito. 1. Búfer de color oculto: la lectura de píxeles es una operación muy lenta. Ciertamente una exageración para una simple prueba de intersección de rayos-esfera.

  1. Ray-esfera de la prueba de intersección: esto no es tan difícil. Esta es una versión simplificada de una implementación en Ogre3d.

    std::pair<bool, m_real> Ray::intersects(const Sphere& sphere) const { const Ray& ray=*this; const vector3& raydir = ray.direction(); // Adjust ray origin relative to sphere center const vector3& rayorig = ray.origin() - sphere.center; m_real radius = sphere.radius; // Mmm, quadratics // Build coeffs which can be used with std quadratic solver // ie t = (-b +/- sqrt(b*b + 4ac)) / 2a m_real a = raydir%raydir; m_real b = 2 * rayorig%raydir; m_real c = rayorig%rayorig - radius*radius; // Calc determinant m_real d = (b*b) - (4 * a * c); if (d < 0) { // No intersection return std::pair<bool, m_real>(false, 0); } else { // BTW, if d=0 there is one intersection, if d > 0 there are 2 // But we only want the closest one, so that's ok, just use the // '-' version of the solver m_real t = ( -b - sqrt(d) ) / (2 * a); if (t < 0) t = ( -b + sqrt(d) ) / (2 * a); return std::pair<bool, m_real>(true, t); } 

    }

Probablemente, un rayo que corresponde a la posición del cursor también necesita ser calculado. Una vez más, puede referirse al código fuente de Ogre3d: search for getCameraToViewportRay. Básicamente, se necesita la matriz de vista y proyección para calcular un Rayo (una posición 3D y una dirección 3D) desde la posición 2D.

En mi proyecto, la solución que elegí fue:

  1. Desprojete sus coordenadas de pantalla 2D a una línea 3D virtual que atraviesa su escena.
  2. Detectar posibles intersecciones de esa línea y sus objetos de escena.

Esto es bastante complejo.

Sólo he hecho esto en Direct3D en lugar de OpenGL ES, pero estos son los pasos:

  1. Encuentre su modelo y las matrices de proyección. Parece que OpenGL ES ha eliminado la capacidad de recuperar las matrices establecidas por gluProject (), etc. Pero puede utilizar las funciones de miembro android.opengl.Matrix para crear estas matrices en su lugar y luego establecerlas con glLoadMatrix ().

  2. Llame a gluUnproject () dos veces, una vez con winZ = 0, luego con winZ = 1. Pase las matrices que calculó anteriormente.

  3. Esto emitirá una posición 3d de cada llamada. Este par de posiciones definen un rayo en OpenGL "world space".

  4. Realice una prueba de intersección de rayos – esfera en cada una de sus esferas en orden. (Más cerca de la cámara primero, de lo contrario puede seleccionar una esfera que está oculta detrás de otra.) Si detecta una intersección, ha tocado la esfera.

Para encontrar el punto de contacto está dentro del círculo o no ..

 public boolean checkInsideCircle(float x,float y, float centerX,float centerY, float Radius) { if(((x - centerX)*(x - centerX))+((y - centerY)*(y - centerY)) < (Radius*Radius)) return true; else return false; } 

dónde

 1) centerX,centerY are center point of circle. 2) Radius is radius of circle. 3) x,y point of touch.. 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.