检测OpenGL对象的触摸?

Anu*_*kar 10 android

我正在开发一个使用OpenGL渲染图像的应用程序.

现在我只想确定我已经烧掉的opengl球体对象上的触摸事件.

在这里我在屏幕上绘制4个对象.现在我应该怎么知道哪个对象已经存在

感动.我使用了onTouchEvent()方法.但它只给我x和y坐标,但我的

对象以3D绘制.

请帮忙,因为我是OpenGL的新手.

最诚挚的问候,~Anup 在此输入图像描述

Wil*_*Kru 9

谷歌IO上有一个关于OpenGL如何用于Android上的Google Body的会议.身体部位的选择是通过将每个部分用纯色渲染到隐藏缓冲区中来完成的,然后根据触摸x上的颜色,可以找到相应的对象.出于性能目的,只有触摸点周围的20x20像素的小裁剪区域才会被渲染.


tbe*_*ear 7

两种方法(1.隐藏颜色缓冲和2.交叉测试)都有其自身的优点.1.隐藏颜色缓冲区:像素读出操作非常慢.对于简单的射线球交叉测试来说当然是一种过度杀伤力.

  1. 射线球相交测试:这并不困难.这是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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    }

可能还需要计算与光标位置对应的光线.您可以再次参考Ogre3d的源代码:搜索getCameraToViewportRay.基本上,您需要视图和投影矩阵来从2D位置计算Ray(3D位置和3D方向).


Cob*_*ast 2

在我的项目中,我选择的解决方案是:

  1. 将 2D 屏幕坐标取消投影到穿过场景的虚拟 3D 线。
  2. 检测该线与场景对象可能的交点。

这是一个相当复杂的味道。