2013-10-03 95 views
2

我是three.js和WebGL的新手。如何确定大物体前面的小物体和相机可见的物体?

在我的应用程序中,有3D场景,其中两个对象。

  1. 对象 - 它是一个大球体;
  2. 对象 - 一个较小的球体,它位于第一个对象的表面上。

大球围绕其轴旋转。而且还有可能围绕球体旋转相机。

所以作为一个大球体表面上的小球体,它也随之旋转。小球体对于我们来说是可见的,因为大球体转向摄像机,并且当大球体位于其前方时它将不可见。

问题是,我该如何确定相机可以看到一个小球体,以及何时不可见?

此外,我需要在2d中获取小球体的可见坐标。我怎样才能做到这一点?

+0

你好迈克,欢迎来到stackoverflow :)这个问题似乎很好的研究,但它可以使用你的一些编辑,以获得一个建设性的答案。如果你能指出你正在使用的部分实现来追踪它们的空间位置,那将是很好的。 –

+0

谢谢:)你说得对 - 格式越少答案就越少。 – Mike

回答

1

这可以使用three.js的内置raycasterprojector功能来完成。要开始,请尝试看看this demo及其源代码。这里是another example。通过这种方式,您可以确定哪些物体更接近从相机位置发出的不可见线。否则,如果您只是对两个物体中的哪一个更接近相机感兴趣,则可以简单地检查它们的哪个位置值与相机坐标的距离较小。三维距离公式会派上用场:

bigSphereDistance = Math.sqrt(Math.pow(camera.position.x - big.position.x,2) + 
           Math.pow(camera.position.y - big.position.y,2) + 
           Math.pow(camera.position.z - big.position.z,2)); 
smallSphereDistance = Math.sqrt(Math.pow(camera.position.x - small.position.x,2) + 
           Math.pow(camera.position.y - small.position.y,2) + 
           Math.pow(camera.position.z - small.position.z,2)); 
//then check... 
bigSphereDistance > smallSphereDistance ? /*case*/ : /*case*/; 

直观上,小球时可见它的距离小于大球,用小球体半径的缓冲区。

要回答你的第二个问题,找到任何物体的2D坐标can accomplished like this