我有一个绘制了一组3d对象的表面。任务是通过表面上的给定坐标确定一个对象。
例如:在桌面应用程序上绘制了一些对象,我需要确定用户点击了哪个对象。
请您告知,这项任务通常如何解决?我需要为每个像素创建记住最顶层的对象吗?我不认为这是最好的方法。
欢迎任何想法!
谢谢!
答案 0 :(得分:2)
此任务的名称为正在挑选(这应该可以帮助Google获取更多帮助)。主要有两种方法:
光线投射:找到从相机位置开始并穿过您感兴趣的曲面点的线条。(“鼠标下方”行或“在您的下方”手指“用于触摸屏。”根据您使用的3D系统,可能会有一个API调用来生成此行:例如Unity3D中的Camera.ViewportPointToRay
,或者您可能必须通过反转相机自行生成它转变。找到此线与场景中对象之间的所有交点。哪些点最接近相机的近平面?您可以使用space partitioning来加快速度。
渲染:执行额外的渲染过程,其中不是将纹理写入帧缓冲区,而是记录绘制的对象。你没有为整个屏幕做渲染过程,你只是为你感兴趣的区域(例如像素)做这个。(在OpenGL中这是GL_SELECT
模式:参见Picking Tutorial for的信息。)
答案 1 :(得分:1)
如果您已经在3D空间中以某种方式描述了曲面,那么由您的观察点定义的光线和作为您点击所在位置的解决方案的3D点应该与您世界中的一个或多个物体相交,如果确实如此你点击了其中一个。
给定物体表面的方程式,您可以确定此光线与物体相交的位置(如果有的话),因为您也知道同一坐标系中光线的方程式。
与您的观察点具有最近交点的对象(假设您正在查看上方的对象)是赢家。