2010-11-19 59 views
3

我有一个表面,一组3d对象被绘制。任务是通过表面上给定的坐标确定一个对象。如何确定3d对象二维投影中最顶层的对象?

例如:某些对象的桌面应用程序绘制的,我需要确定哪些对象用户点击。

能否请您指教,任务怎么这么通常解决?我需要创建记住每个像素的最顶端的对象吗?我不认为这是最好的方法。

有什么想法,欢迎!

谢谢!

+0

您可能会包含一个图... – 2010-11-19 23:08:48

回答

2

此任务的名称是挑选(这应该可以帮助Google获得更多帮助)。主要有两种方法:

  1. 光线投射:发现开始在该相机位置并通过表面点您感兴趣的线路(“鼠标下的”行,或者“在你的手指下“)。根据你正在使用的3D系统,可能会有一个API调用来产生这条线:例如Unity3D中的Camera.ViewportPointToRay,或者你可能必须通过反转相机变换来自己生成它。找到这条线和场景中的物体之间的所有交点。哪一点最接近相机的近平面?你可以使用space partitioning来加速。

  2. 渲染:做一个额外的渲染通道,其中不是将纹理写入帧缓冲区,而是记录哪些对象被绘制。你不这样做的渲染过程的整个屏幕,你只是做它的区域(例如像素)你有兴趣(这是GL_SELECT模式在OpenGL:看Picking Tutorial了解详细信息)。

1

如果你在三维空间中描述的面弄好了,那么射线,通过你的观察和3D逐点定义是你点击其中一个解决方案,应该在你的世界相交一个或多个对象,如果确实你点击了其中一个。

鉴于方程的物体表面,就可以判断这个地方光线与物体,如果有的话,因为你也知道同样的坐标系中的射线方程。

具有最接近交叉点到你的观察点(假设你看从上面的对象)的对象是赢家。