OpenGL中的光线球体相交



我正在尝试使用光线球体交点在OpenGL中执行鼠标拾取。我在网上找到了一些公式,我最后尝试的是Stack Exchange上的一位用户建议的公式:

光线球体相交

根据我对这个答案的理解,我正在检查二次方程是否有正根。我真的不在乎相交发生在哪里,只要光线与球体相交就行了。我的代码如下,但似乎不起作用。

bool Mesh::useObject(vec3 camera, vec3 direction) {
    // a = (xB-xA)²+(yB-yA)²+(zB-zA)²
    float a = ((direction.v[0] - camera.v[0])*(direction.v[0] - camera.v[0])
        + (direction.v[1] - camera.v[1])*(direction.v[1] - camera.v[1])
        + (direction.v[2] - camera.v[2])*(direction.v[2] - camera.v[2]));
    // b = 2*((xB-xA)(xA-xC)+(yB-yA)(yA-yC)+(zB-zA)(zA-zC))
    float b = 2 * ((direction.v[0] - camera.v[0])*(camera.v[0] - mOrigin.v[0])
        + (direction.v[1] - camera.v[1])*(camera.v[1] - mOrigin.v[1])
        + (direction.v[2] - camera.v[2])*(camera.v[2] - mOrigin.v[2]));
    // c = (xA-xC)²+(yA-yC)²+(zA-zC)²-r²
    float c = ((camera.v[0] - mOrigin.v[0])*(camera.v[0] - mOrigin.v[0])
        + (camera.v[1] - mOrigin.v[1])*(camera.v[1] - mOrigin.v[1])
        + (camera.v[2] - mOrigin.v[2])*(camera.v[2] - mOrigin.v[2])
        - (mRadius)*(mRadius));
    float delta = (b*b) - (4 * a*c);
    if (delta < 0)
        return false;
    else {
        std::cout << "Object " << mMesh << " is at postion (" <<
            mOrigin.v[0] << ", " <<
            mOrigin.v[1] << ", " <<
            mOrigin.v[2] << ")n" <<
            "Size: " << mRadius << std::endl;
        return true;
    }
}

我的C++技能相当生疏,所以如果这是一种糟糕的方式,我很抱歉。这个方法取三个浮动的两个矢量,相机的位置,以及相机前面场景1单元中一个点的坐标(我称之为这个方向)。

当我面对一个对象并按键时,我想得到对象的位置和半径,但只有当我站在场景中的一个对象上,或者站在另一个大对象附近时,我才能得到输出。很明显,我的计算(或者更糟的是,我的代码)有问题,但我无法弄清楚那是什么

如果您需要更多的代码,或者有什么不清楚的地方,请告诉我。这是我向SO提出的第一个问题,所以如果这个问题措辞不当,我很抱歉。

编辑:我不应该使用鼠标坐标作为光线上的一个点。稍微修改了我的问题。

该代码看起来相当混乱。检查直线(direction,origin)与球体(centerradius)相交的一般公式应为:

length(cross(direction, center-origin)) / length(direction) < radius

检查您是否正确实现了这一点,也许可以将一些操作分解为单独的函数。

相关内容

  • 没有找到相关文章

最新更新