OpenGL中的3D对象选择

5sxhfpxr  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(180)

我目前正在用opengl制作一个3d国际象棋游戏。我仍然在为选择不同的数字而挣扎。我遵循了thinmatrix的教程,并走到了这一步:https://imgur.com/gallery/oLv5ReI
现在,我希望用户能够通过点击图形来选择它们。我有相机的位置,鼠标指向的射线方向和图形的位置。当射线从相机的位置开始时,我如何检测射线是否击中图形(可能使用矩形点击框)?
我目前的代码:

public void update(Vector3f mouseRay, Camera camera, Figure figure){
    Vector3f start = camera.getPosition();
    Vector3f figurePos = figure.getPosition();
    if(intersect()){
       selectFigure();
    }
}

编辑:我试过了:Ray-Sphere intersection,但不知何故,它不起作用。球体相交似乎也非常低效的方面,射线盒相交。

gfttwv5a

gfttwv5a1#

您必须遵循以下步骤(我假设您了解渲染管道和OpenGL/WebGL)
1.获取所有对象的列表。
1.为每个对象分配一个唯一的颜色。下面是根据列表中对象的索引来分配唯一颜色的简单方法。

int i = // Index of the object  
    // We've added 1 to the index because 0 index is translated to black color 
    // And our background is also rendered as black so we skip will that color.
    int r = (i + 1 & 0x000000FF) >> 0;
    int g = (i + 1 & 0x0000FF00) >> 8;
    int b = (i + 1 & 0x00FF0000) >> 16;
    glm::vec4 unique_color = glm::vec4(r / 255.0f, g / 255.0f, b / 255.0f, 1.0);

1.创建一个帧缓冲区,并使用为其唯一指定的纯色渲染所有对象。
1.渲染完成后,现在可以从渲染的帧缓冲区纹理中读取单击位置像素颜色。
1.将颜色解码为对象的索引,如下所示。(这与我们在第2步中所做的完全相反)

int triangle_index =
        color.r +
        color.g * 256 +
        color.b * 256 * 256;

1.使用此索引,您可以从所有对象的初始列表中选择对象。
1.您可以在http://www.opengl-tutorial.org/miscellaneous/clicking-on-objects/picking-with-an-opengl-hack/阅读有关此技术的更多信息

相关问题